From b921c8fd41b56c400a1b73ebdf07fdedc9512fdd Mon Sep 17 00:00:00 2001 From: Thomas Huang Date: Tue, 26 Mar 2019 13:04:05 -0400 Subject: [PATCH] Update master branch (#6296) * Fixes the 'Percentages row tracks and gutters' decpracation warning. (#6244) * Fix missing this reference in addtoken button onclick method (#6245) * Only call onRecipient and onSender methods if defined in sender-to-recipient (#6247) * Prevent advanced gas input arrows from setting value to < 0 (#6248) * Add privacy policy link to modal metrics opt-in (#6250) * Handle undefined gas limits and prices in transaction-breakdown.component (#6246) * Uppercase and context fixes on Spanish translation. * development - enhancement for sourcemap validator tool (#6277) * Nonmultiple notifications for batch txs * No longer check network when validating checksum addresses * Version 6.2.1 (#6251) * Remove line rather than comment out * Fixes the use of the browser back button on the reveal seed screen * GABA: Integrate AddressBookController (#5847) * gaba: integrate AddressBookController * pin gaba version and update lockfile * ci: Use cache version from circle environment var (#6286) * Allow npm to update the package-lock.json file * npm i -D ganache-core@2.5.3 * mascara - remove from project (#6283) * circleci - disable npm dep cache (#6288) * Centre all notification popups * ui - add missing PropTypes (#6287) * Improve Korean translations (#6268) * ci: Use npm ci for fast(er) installs * build - babel - move config to babelrc (#6284) * Patch/bump version (#6294) * Update Node minor version * ci: Skip updating npm@6 as it is default * Allow seed phrases with a trailing newline * Centre the notification in the current window (#6307) * Fixes popups not showing when screen size is odd (#6312) * Fix typos in English messages (#6317) * Add rollback script, move auto-changelog script (#6252) * Bump gaba version to avoid broken eth-contract-metadata * Fixing spelling of Ethereum in MetaMetrics copy (#6329) * Stop reloading dapps on network change allowing dapps to decide if it should refresh or not (#6330) * feat: `inpageProvider.autoRefreshOnNetworkChange` to allow dapps to control if it refreshes or not * feat: check the `autoRefreshOnNetworkChange` before a refresh * fix linting error * fix: use `window.ethereum` now `web3.ethereum` * Enable mobile sync (#6332) * enable mobile sync * remove mobile sync as a preference * Fix typo * Folder restructure (#6304) * Remove ui/app/keychains/ * Remove ui/app/img/ (unused images) * Move conversion-util to helpers/utils/ * Move token-util to helpers/utils/ * Move /helpers/*.js inside /helpers/utils/ * Move util tests inside /helpers/utils/ * Renameand move confirm-transaction/util.js to helpers/utils/ * Move higher-order-components to helpers/higher-order-components/ * Move infura-conversion.json to helpers/constants/ * Move all utility functions to helpers/utils/ * Move pages directory to top-level * Move all constants to helpers/constants/ * Move metametrics inside helpers/ * Move app and root inside pages/ * Move routes inside helpers/ * Re-organize ducks/ * Move reducers to ducks/ * Move selectors inside selectors/ * Move test out of test folder * Move action, reducer, store inside store/ * Move ui components inside ui/ * Move UI components inside ui/ * Move connected components inside components/app/ * Move i18n-helper inside helpers/ * Fix unit tests * Fix unit test * Move pages components * Rename routes component * Move reducers to ducks/index * Fix bad path in unit test * Hide gas price chart and prevent api call when not on ethereum networks. (#6300) Add missing translations in gas customization modal * Fix gas fee in the submitted step of the transaction details activity log. (#6301) * Fix oversized loading overlay on gas customization modal. (#6326) * Replaces the coinbase link in the deposit modal with one for wyre (#6302) * New settings page rebased (#6333) * New setting tab * Add InfoTab * Add Advanced tab * Add Security Tab * Finish mobile view * Make new setting page responsive * Fix linter * Fix y scrolling * Update link in network dropdown * Fix e2e tests * Remove duplicate translation key * Resolve merge conflict * Only change settings header in popup view. * Place mobile-sync button in advanced-tab of settings * Close transaction on close of notification window (#6340) * Cancel error rebased (#6341) * Check balance before showing cancel * Fix linter * Use existing helper methods for calculating increased cancel price * Add tooltip for disabled button * Lint fix for cancelError branch. * Disabling of cancel button should account for value of tx. * E2E - Dont close window notifications (#6349) * Dont close window notifications * Remove commented out lines in beta spec * Don't include tx value in calculation of balance sufficiency for cancel button disabling. (#6346) * enable privacy mode for first time users (#6347) * Version 6.3.0 (#6350) --- .babelrc | 25 +- .circleci/config.yml | 68 +- .eslintignore | 3 - .nvmrc | 2 +- .stylelintignore | 1 - CHANGELOG.md | 26 +- Dockerfile | 25 - app/_locales/en/messages.json | 49 +- app/_locales/es/messages.json | 36 +- app/_locales/ko/messages.json | 379 ++- app/images/caret-left-black.svg | 18 + app/images/wyre.svg | 9 + app/manifest.json | 2 +- app/scripts/background.js | 3 +- app/scripts/controllers/address-book.js | 98 - app/scripts/controllers/preferences.js | 4 +- .../controllers/transactions/tx-gas-utils.js | 2 +- app/scripts/inpage.js | 4 + app/scripts/lib/ComposableObservableStore.js | 4 +- app/scripts/lib/auto-reload.js | 4 + app/scripts/lib/buy-eth-url.js | 2 +- app/scripts/lib/notification-manager.js | 14 +- app/scripts/metamask-controller.js | 15 +- .../auto-changelog.sh | 0 development/metamaskbot-build-announce.js | 2 - development/mock-dev.js | 6 +- development/rollback.sh | 35 + development/sourcemap-validator.js | 93 +- development/states/navigate-txs.json | 1 - development/states/pending-tx.json | 1 - development/ui-dev.js | 2 +- development/uiStore.js | 2 +- docker-compose.yml | 11 - docs/adding-new-networks.md | 2 +- docs/secret-preferences.md | 2 +- docs/sensitive-release.md | 8 +- gulpfile.js | 53 - mascara/README.md | 33 - mascara/example/app.js | 38 - mascara/example/app/index.html | 17 - mascara/example/server.js | 31 - mascara/proxy/index.html | 20 - mascara/server/index.js | 21 - mascara/server/util.js | 47 - mascara/src/app/buy-ether-widget/index.js | 2 +- mascara/src/app/shapeshift-form/index.js | 4 +- mascara/src/background.js | 134 - mascara/src/metamascara.js | 1 - mascara/src/proxy.js | 25 - mascara/src/ui.js | 73 - mascara/test/helpers.js | 7 - mascara/test/index.js | 22 - mascara/test/jquery-3.1.0.min.js | 4 - mascara/test/test-ui.js | 10 - mascara/test/util/mascara-test-helper.js | 42 - mascara/ui/index.html | 12 - package-lock.json | 2518 ++++++++++++----- package.json | 47 +- test/e2e/beta/metamask-beta-ui.spec.js | 18 +- test/mascara.conf.js | 17 - test/unit/actions/config_test.js | 4 +- test/unit/actions/set_account_label_test.js | 4 +- .../unit/actions/set_selected_account_test.js | 4 +- test/unit/actions/tx_test.js | 2 +- test/unit/actions/view_info_test.js | 4 +- test/unit/actions/warning_test.js | 4 +- test/unit/app/buy-eth-url.spec.js | 11 +- .../controllers/address-book-controller.js | 54 - test/unit/balance-formatter-test.js | 2 +- test/unit/reducers/unlock_vault_test.js | 4 +- .../responsive/components/dropdown-test.js | 2 +- test/unit/ui/app/actions.spec.js | 2 +- .../unit/ui/app/components/token-cell.spec.js | 4 +- test/unit/ui/app/reducers/app.spec.js | 4 +- test/unit/ui/app/reducers/metamask.spec.js | 4 +- test/unit/ui/app/selectors.spec.js | 2 +- test/unit/util_test.js | 2 +- ui/.gitignore | 66 - ui/app/accounts/new-account/index.js | 87 - .../components/{ => app}/account-dropdowns.js | 6 +- .../account-menu/account-menu.component.js | 13 +- .../account-menu/account-menu.container.js | 4 +- .../{ => app}/account-menu/index.js | 0 .../{ => app}/account-menu/index.scss | 0 ui/app/components/{ => app}/account-panel.js | 6 +- .../add-token-button.component.js | 0 .../{ => app}/add-token-button/index.js | 0 .../{ => app}/add-token-button/index.scss | 0 .../app-header/app-header.component.js | 4 +- .../app-header/app-header.container.js | 2 +- .../components/{ => app}/app-header/index.js | 0 .../{ => app}/app-header/index.scss | 0 .../{ => app}/bn-as-decimal-input.js | 0 ui/app/components/{ => app}/coinbase-form.js | 2 +- .../confirm-detail-row.component.js | 2 +- .../confirm-detail-row/index.js | 0 .../confirm-detail-row/index.scss | 0 .../confirm-detail-row.component.test.js | 0 ...onfirm-page-container-content.component.js | 6 +- ...onfirm-page-container-summary.component.js | 2 +- .../confirm-page-container-summary/index.js | 0 .../confirm-page-container-summary/index.scss | 0 ...onfirm-page-container-warning.component.js | 0 .../confirm-page-container-warning/index.js | 0 .../confirm-page-container-warning/index.scss | 0 .../confirm-page-container-content/index.js | 0 .../confirm-page-container-content/index.scss | 4 +- ...confirm-page-container-header.component.js | 2 +- .../confirm-page-container-header/index.js | 0 .../confirm-page-container-header/index.scss | 0 ...irm-page-container-navigation.component.js | 0 .../index.js | 0 .../index.scss | 0 .../confirm-page-container.component.js | 6 +- .../{ => app}/confirm-page-container/index.js | 0 .../app/confirm-page-container/index.scss | 7 + ui/app/components/{ => app}/copyable.js | 2 +- .../customize-gas-modal/gas-modal-card.js | 0 .../customize-gas-modal/gas-slider.js | 0 .../{ => app}/customize-gas-modal/index.js | 10 +- .../dropdowns/account-details-dropdown.js | 6 +- .../dropdowns/components/account-dropdowns.js | 10 +- .../dropdowns/components/dropdown.js | 0 .../{ => app}/dropdowns/components/menu.js | 0 .../components/network-dropdown-icon.js | 0 .../components/{ => app}/dropdowns/index.js | 0 .../{ => app}/dropdowns/network-dropdown.js | 6 +- .../{ => app}/dropdowns/simple-dropdown.js | 0 .../dropdowns/tests/dropdown.test.js | 0 .../{ => app}/dropdowns/tests/menu.test.js | 0 .../tests/network-dropdown-icon.test.js | 0 .../dropdowns/tests/network-dropdown.test.js | 2 +- .../dropdowns/token-menu-dropdown.js | 2 +- ui/app/components/{ => app}/ens-input.js | 2 +- .../advanced-gas-inputs.component.js | 14 +- .../advanced-gas-inputs.container.js | 4 +- .../advanced-gas-inputs/index.js | 0 .../advanced-gas-inputs/index.scss | 0 .../advanced-tab-content.component.js | 39 +- .../advanced-tab-content/index.js | 0 .../advanced-tab-content/index.scss | 4 + .../advanced-tab-content-component.test.js | 17 +- .../time-remaining/index.js | 0 .../time-remaining/index.scss | 0 .../tests/time-remaining-component.test.js | 2 +- .../time-remaining.component.js | 0 .../time-remaining/time-remaining.utils.js | 0 .../basic-tab-content.component.js | 2 +- .../basic-tab-content/index.js | 0 .../basic-tab-content/index.scss | 0 .../tests/basic-tab-content-component.test.js | 6 +- .../gas-modal-page-container.component.js | 6 +- .../gas-modal-page-container.container.js | 30 +- .../gas-modal-page-container/index.js | 0 .../gas-modal-page-container/index.scss | 0 ...gas-modal-page-container-component.test.js | 8 +- ...gas-modal-page-container-container.test.js | 22 +- .../gas-price-button-group.component.js | 4 +- .../gas-price-button-group/index.js | 0 .../gas-price-button-group/index.scss | 0 .../gas-price-button-group-component.test.js | 4 +- .../gas-price-chart.component.js | 0 .../gas-price-chart/gas-price-chart.utils.js | 0 .../gas-price-chart/index.js | 0 .../gas-price-chart/index.scss | 0 .../tests/gas-price-chart.component.test.js | 2 +- .../gas-slider/gas-slider.component.js | 0 .../gas-customization/gas-slider/index.js | 0 .../gas-customization/gas-slider/index.scss | 0 .../gas-customization/gas.selectors.js | 0 .../{ => app}/gas-customization/index.scss | 0 ui/app/components/app/index.scss | 81 + ui/app/components/{ => app}/info-box/index.js | 0 .../components/{ => app}/info-box/index.scss | 0 .../{ => app}/info-box/info-box.component.js | 0 ui/app/components/{ => app}/input-number.js | 2 +- .../{ => app}/loading-network-screen/index.js | 0 .../loading-network-screen.component.js | 4 +- .../loading-network-screen.container.js | 4 +- ui/app/components/{ => app}/menu-bar/index.js | 0 .../components/{ => app}/menu-bar/index.scss | 0 .../{ => app}/menu-bar/menu-bar.component.js | 49 +- .../{ => app}/menu-bar/menu-bar.container.js | 5 +- ui/app/components/{ => app}/menu-droppo.js | 0 ui/app/components/{ => app}/modal/index.js | 0 ui/app/components/{ => app}/modal/index.scss | 2 +- .../{ => app}/modal/modal-content/index.js | 0 .../{ => app}/modal/modal-content/index.scss | 0 .../modal-content/modal-content.component.js | 0 .../tests/modal-content.component.test.js | 0 .../{ => app}/modal/modal.component.js | 2 +- .../modal/tests/modal.component.test.js | 2 +- .../{ => app}/modals/account-details-modal.js | 12 +- .../modals/account-modal-container.js | 6 +- .../{ => app}/modals/buy-options-modal.js | 4 +- .../cancel-transaction-gas-fee.component.js | 2 +- .../cancel-transaction-gas-fee/index.js | 0 .../cancel-transaction-gas-fee/index.scss | 0 ...ncel-transaction-gas-fee.component.test.js | 0 .../cancel-transaction.component.js | 2 +- .../cancel-transaction.container.js | 8 +- .../modals/cancel-transaction/index.js | 0 .../modals/cancel-transaction/index.scss | 4 +- .../cancel-transaction.component.test.js | 0 .../clear-approved-origins.component.js | 0 .../clear-approved-origins.container.js | 4 +- .../modals/clear-approved-origins/index.js | 0 .../confirm-remove-account.component.js | 6 +- .../confirm-remove-account.container.js | 4 +- .../modals/confirm-remove-account/index.js | 0 .../modals/confirm-remove-account/index.scss | 0 .../confirm-reset-account.component.js | 0 .../confirm-reset-account.container.js | 4 +- .../modals/confirm-reset-account/index.js | 0 .../customize-gas/customize-gas.component.js | 2 +- .../customize-gas/customize-gas.container.js | 2 +- .../customize-gas/customize-gas.util.js | 2 +- .../{ => app}/modals/customize-gas/index.js | 0 .../{ => app}/modals/customize-gas/index.scss | 0 .../{ => app}/modals/deposit-ether-modal.js | 22 +- .../modals/edit-account-name-modal.js | 4 +- .../modals/export-private-key-modal.js | 10 +- .../modals/hide-token-confirmation-modal.js | 4 +- ui/app/components/{ => app}/modals/index.js | 0 ui/app/components/app/modals/index.scss | 11 + .../modals/loading-network-error/index.js | 0 .../loading-network-error.component.js | 0 .../loading-network-error.container.js | 2 +- .../modals/metametrics-opt-in-modal/index.js | 0 .../metametrics-opt-in-modal/index.scss | 0 .../metametrics-opt-in-modal.component.js | 12 +- .../metametrics-opt-in-modal.container.js | 4 +- ui/app/components/{ => app}/modals/modal.js | 10 +- .../{ => app}/modals/new-account-modal.js | 2 +- .../{ => app}/modals/notification-modal.js | 2 +- .../{ => app}/modals/qr-scanner/index.js | 0 .../{ => app}/modals/qr-scanner/index.scss | 0 .../modals/qr-scanner/qr-scanner.component.js | 6 +- .../modals/qr-scanner/qr-scanner.container.js | 4 +- .../modals/reject-transactions/index.js | 0 .../modals/reject-transactions/index.scss | 0 .../reject-transactions.component.js | 0 .../reject-transactions.container.js | 2 +- .../modals/shapeshift-deposit-tx-modal.js | 4 +- .../modals/transaction-confirmed/index.js | 0 .../modals/transaction-confirmed/index.scss | 0 .../transaction-confirmed.component.js | 0 .../transaction-confirmed.container.js | 2 +- .../{ => app}/network-display/index.js | 0 .../{ => app}/network-display/index.scss | 0 .../network-display.component.js | 2 +- .../network-display.container.js | 0 ui/app/components/{ => app}/network.js | 0 ui/app/components/{ => app}/notice.js | 0 .../provider-page-container/index.js | 0 .../provider-page-container/index.scss | 0 .../provider-page-container-content/index.js | 0 ...ovider-page-container-content.component.js | 2 +- ...ovider-page-container-content.container.js | 2 +- .../provider-page-container-header/index.js | 0 ...rovider-page-container-header.component.js | 0 .../provider-page-container.component.js | 4 +- .../{ => app}/selected-account/index.js | 0 .../{ => app}/selected-account/index.scss | 0 .../selected-account.component.js | 4 +- .../selected-account.container.js | 2 +- .../tests/selected-account-component.test.js | 0 ui/app/components/{ => app}/send/README.md | 0 .../account-list-item-README.md | 0 .../account-list-item.component.js | 8 +- .../account-list-item.container.js | 2 +- .../{ => app}/send/account-list-item/index.js | 0 .../tests/account-list-item-component.test.js | 4 +- .../tests/account-list-item-container.test.js | 2 +- ui/app/components/{ => app}/send/index.js | 0 .../{ => app}/send/send-content/index.js | 0 .../send-content/send-amount-row/README.md | 0 .../amount-max-button.component.js | 0 .../amount-max-button.container.js | 4 +- .../amount-max-button.selectors.js | 0 .../amount-max-button.utils.js | 2 +- .../amount-max-button/index.js | 0 .../tests/amount-max-button-component.test.js | 0 .../tests/amount-max-button-container.test.js | 4 +- .../tests/amount-max-button-selectors.test.js | 0 .../tests/amount-max-button-utils.test.js | 0 .../send-content/send-amount-row/index.js | 0 .../send-amount-row.component.js | 4 +- .../send-amount-row.container.js | 4 +- .../send-amount-row/send-amount-row.scss | 0 .../send-amount-row.selectors.js | 0 .../tests/send-amount-row-component.test.js | 0 .../tests/send-amount-row-container.test.js | 4 +- .../tests/send-amount-row-selectors.test.js | 0 .../send-content/send-content.component.js | 10 +- .../send-content/send-dropdown-list/index.js | 0 .../send-dropdown-list.component.js | 2 +- .../send-dropdown-list-component.test.js | 0 .../send/send-content/send-from-row/index.js | 0 .../send-from-row/send-from-row.component.js | 2 +- .../send-from-row/send-from-row.container.js | 0 .../send-from-row/send-from-row.selectors.js | 0 .../tests/send-from-row-component.test.js | 0 .../tests/send-from-row-container.test.js | 0 .../tests/send-from-row-selectors.test.js | 0 .../send/send-content/send-gas-row/README.md | 0 .../gas-fee-display.component.js | 2 +- .../send-gas-row/gas-fee-display/index.js | 0 .../test/gas-fee-display.component.test.js | 0 .../send/send-content/send-gas-row/index.js | 0 .../send-gas-row/send-gas-row.component.js | 2 +- .../send-gas-row/send-gas-row.container.js | 10 +- .../send-gas-row/send-gas-row.scss | 0 .../send-gas-row/send-gas-row.selectors.js | 0 .../tests/send-gas-row-component.test.js | 0 .../tests/send-gas-row-container.test.js | 10 +- .../tests/send-gas-row-selectors.test.js | 0 .../send-content/send-hex-data-row/index.js | 0 .../send-hex-data-row.component.js | 0 .../send-hex-data-row.container.js | 2 +- .../send-content/send-row-wrapper/index.js | 0 .../send-row-error-message/index.js | 0 .../send-row-error-message-README.md | 0 .../send-row-error-message.component.js | 0 .../send-row-error-message.container.js | 0 .../send-row-error-message.scss | 0 .../send-row-error-message-component.test.js | 0 .../send-row-error-message-container.test.js | 0 .../send-row-warning-message/index.js | 0 .../send-row-warning-message.component.js | 0 .../send-row-warning-message.container.js | 0 .../send-row-warning-message.scss | 0 ...send-row-warning-message-component.test.js | 0 ...send-row-warning-message-container.test.js | 0 .../send-row-wrapper-README.md | 0 .../send-row-wrapper.component.js | 4 +- .../send-row-wrapper/send-row-wrapper.scss | 0 .../tests/send-row-wrapper-component.test.js | 0 .../send/send-content/send-to-row/index.js | 0 .../send-to-row/send-to-row-README.md | 0 .../send-to-row/send-to-row.component.js | 2 +- .../send-to-row/send-to-row.container.js | 4 +- .../send-to-row/send-to-row.selectors.js | 0 .../send-to-row/send-to-row.utils.js | 4 +- .../tests/send-to-row-component.test.js | 0 .../tests/send-to-row-container.test.js | 4 +- .../tests/send-to-row-selectors.test.js | 0 .../tests/send-to-row-utils.test.js | 2 +- .../tests/send-content-component.test.js | 2 +- .../{ => app}/send/send-footer/README.md | 0 .../{ => app}/send/send-footer/index.js | 0 .../send/send-footer/send-footer.component.js | 4 +- .../send/send-footer/send-footer.container.js | 2 +- .../send/send-footer/send-footer.scss | 0 .../send/send-footer/send-footer.selectors.js | 0 .../send/send-footer/send-footer.utils.js | 0 .../tests/send-footer-component.test.js | 4 +- .../tests/send-footer-container.test.js | 2 +- .../tests/send-footer-selectors.test.js | 0 .../tests/send-footer-utils.test.js | 0 .../{ => app}/send/send-header/README.md | 0 .../{ => app}/send/send-header/index.js | 0 .../send/send-header/send-header.component.js | 4 +- .../send/send-header/send-header.container.js | 2 +- .../send/send-header/send-header.selectors.js | 0 .../tests/send-header-component.test.js | 4 +- .../tests/send-header-container.test.js | 2 +- .../tests/send-header-selectors.test.js | 0 .../{ => app}/send/send.component.js | 8 +- .../{ => app}/send/send.constants.js | 2 +- .../{ => app}/send/send.container.js | 8 +- ui/app/components/{ => app}/send/send.scss | 0 .../{ => app}/send/send.selectors.js | 8 +- .../components/{ => app}/send/send.utils.js | 4 +- .../send/tests/send-component.test.js | 2 +- .../send/tests/send-container.test.js | 4 +- .../send/tests/send-selectors-test-data.js | 0 .../send/tests/send-selectors.test.js | 0 .../{ => app}/send/tests/send-utils.test.js | 6 +- .../send/to-autocomplete.component.js | 2 +- .../{ => app}/send/to-autocomplete/index.js | 0 .../send/to-autocomplete/to-autocomplete.js | 4 +- .../components/{ => app}/shapeshift-form.js | 6 +- .../components/{ => app}/shift-list-item.js | 10 +- ui/app/components/{ => app}/sidebars/index.js | 0 .../components/{ => app}/sidebars/index.scss | 4 +- .../{ => app}/sidebars/sidebar-content.scss | 0 .../{ => app}/sidebars/sidebar.component.js | 0 .../{ => app}/sidebars/sidebar.constants.js | 0 .../sidebars/tests/sidebars-component.test.js | 0 .../components/{ => app}/signature-request.js | 99 +- ui/app/components/app/tab-bar.js | 37 + ui/app/components/{ => app}/token-cell.js | 10 +- ui/app/components/{ => app}/token-list.js | 2 +- .../{ => app}/transaction-action/index.js | 0 .../transaction-action.component.test.js | 0 .../transaction-action.component.js | 4 +- .../transaction-activity-log/index.js | 0 .../transaction-activity-log/index.scss | 0 ...transaction-activity-log.component.test.js | 0 ...transaction-activity-log.container.test.js | 0 .../transaction-activity-log.util.test.js | 0 .../transaction-activity-log-icon/index.js | 0 ...transaction-activity-log-icon.component.js | 0 .../transaction-activity-log.component.js | 6 +- .../transaction-activity-log.constants.js | 0 .../transaction-activity-log.container.js | 2 +- .../transaction-activity-log.util.js | 17 +- .../{ => app}/transaction-breakdown/index.js | 0 .../transaction-breakdown/index.scss | 2 +- .../transaction-breakdown.component.test.js | 0 .../transaction-breakdown-row/index.js | 0 .../transaction-breakdown-row/index.scss | 0 ...ransaction-breakdown-row.component.test.js | 2 +- .../transaction-breakdown-row.component.js | 0 .../transaction-breakdown.component.js | 49 +- .../transaction-breakdown.container.js | 29 + .../transaction-list-item-details/index.js | 0 .../transaction-list-item-details/index.scss | 0 ...action-list-item-details.component.test.js | 4 +- ...transaction-list-item-details.component.js | 68 +- .../{ => app}/transaction-list-item/index.js | 0 .../transaction-list-item/index.scss | 0 .../transaction-list-item.component.js | 15 +- .../transaction-list-item.container.js | 36 +- .../{ => app}/transaction-list/index.js | 0 .../{ => app}/transaction-list/index.scss | 2 +- .../transaction-list.component.js | 2 +- .../transaction-list.container.js | 8 +- .../{ => app}/transaction-status/index.js | 0 .../{ => app}/transaction-status/index.scss | 0 .../transaction-status.component.test.js | 2 +- .../transaction-status.component.js | 4 +- .../transaction-view-balance/index.js | 0 .../transaction-view-balance/index.scss | 0 .../token-view-balance.component.test.js | 4 +- .../transaction-view-balance.component.js | 12 +- .../transaction-view-balance.container.js | 4 +- .../{ => app}/transaction-view/index.js | 0 .../{ => app}/transaction-view/index.scss | 0 .../transaction-view.component.js | 0 .../ui-migration-annoucement/index.js | 0 .../ui-migration-annoucement/index.scss | 0 .../ui-migration-annoucement.component.js | 0 .../ui-migration-announcement.container.js | 2 +- .../index.js | 0 ...erenced-currency-display.component.test.js | 2 +- ...erenced-currency-display.container.test.js | 0 ...-preferenced-currency-display.component.js | 4 +- ...-preferenced-currency-display.container.js | 4 +- .../user-preferenced-currency-input/index.js | 0 ...eferenced-currency-input.component.test.js | 2 +- ...eferenced-currency-input.container.test.js | 0 ...er-preferenced-currency-input.component.js | 2 +- ...er-preferenced-currency-input.container.js | 2 +- .../user-preferenced-token-input/index.js | 0 ...-preferenced-token-input.component.test.js | 2 +- ...-preferenced-token-input.container.test.js | 0 .../user-preferenced-token-input.component.js | 2 +- .../user-preferenced-token-input.container.js | 2 +- ui/app/components/{ => app}/wallet-view.js | 17 +- .../confirm-page-container/index.scss | 7 - ui/app/components/index.scss | 81 - ui/app/components/modals/index.scss | 11 - ui/app/components/pages/index.scss | 11 - ui/app/components/pages/settings/index.scss | 80 - .../settings-tab/settings-tab.container.js | 83 - .../pages/settings/settings.component.js | 54 - ui/app/components/tab-bar.js | 33 - .../transaction-breakdown.container.js | 15 - .../account-dropdown-mini.component.js | 2 +- .../{ => ui}/account-dropdown-mini/index.js | 0 .../account-dropdown-mini.component.test.js | 2 +- ui/app/components/{ => ui}/alert/index.js | 0 .../{ => ui}/balance/balance.component.js | 6 +- .../{ => ui}/balance/balance.container.js | 2 +- ui/app/components/{ => ui}/balance/index.js | 0 .../breadcrumbs/breadcrumbs.component.js | 0 .../components/{ => ui}/breadcrumbs/index.js | 0 .../{ => ui}/breadcrumbs/index.scss | 0 .../tests/breadcrumbs.component.test.js | 0 .../button-group/button-group.component.js | 0 .../button-group/button-group.stories.js | 2 +- .../components/{ => ui}/button-group/index.js | 0 .../{ => ui}/button-group/index.scss | 0 .../tests/button-group-component.test.js | 0 .../{ => ui}/button/button.component.js | 0 .../{ => ui}/button/button.stories.js | 2 +- ui/app/components/{ => ui}/button/index.js | 0 .../{ => ui}/card/card.component.js | 0 ui/app/components/{ => ui}/card/index.js | 0 ui/app/components/{ => ui}/card/index.scss | 0 .../card/tests/card.component.test.js | 0 ui/app/components/{ => ui}/copyButton.js | 0 .../currency-display.component.js | 2 +- .../currency-display.container.js | 2 +- .../{ => ui}/currency-display/index.js | 0 .../{ => ui}/currency-display/index.scss | 0 .../tests/currency-display.component.test.js | 0 .../tests/currency-display.container.test.js | 0 .../currency-input.component.js | 4 +- .../currency-input.container.js | 4 +- .../{ => ui}/currency-input/index.js | 0 .../{ => ui}/currency-input/index.scss | 0 .../tests/currency-input.component.test.js | 0 .../tests/currency-input.container.test.js | 0 ui/app/components/{ => ui}/editable-label.js | 0 .../error-message/error-message.component.js | 0 .../{ => ui}/error-message/index.js | 0 .../{ => ui}/error-message/index.scss | 0 .../tests/error-message.component.test.js | 0 ui/app/components/{ => ui}/eth-balance.js | 2 +- .../export-text-container.component.js | 2 +- .../{ => ui}/export-text-container/index.js | 0 .../{ => ui}/export-text-container/index.scss | 0 ui/app/components/{ => ui}/fiat-value.js | 2 +- .../hex-to-decimal.component.js | 2 +- .../{ => ui}/hex-to-decimal/index.js | 0 .../tests/hex-to-decimal.component.test.js | 0 .../{ => ui}/identicon/identicon.component.js | 4 +- .../{ => ui}/identicon/identicon.container.js | 0 ui/app/components/{ => ui}/identicon/index.js | 0 .../components/{ => ui}/identicon/index.scss | 0 .../tests/identicon.component.test.js | 0 ui/app/components/{ => ui}/jazzicon/index.js | 0 .../{ => ui}/jazzicon/jazzicon.component.js | 2 +- .../{ => ui}/loading-screen/index.js | 0 .../loading-screen.component.js | 0 ui/app/components/{ => ui}/lock-icon/index.js | 0 .../{ => ui}/lock-icon/lock-icon.component.js | 0 ui/app/components/{ => ui}/mascot.js | 0 .../{ => ui}/page-container/index.js | 0 .../{ => ui}/page-container/index.scss | 0 .../page-container-content.component.js | 0 .../page-container-footer/index.js | 0 .../page-container-footer.component.js | 0 .../page-container-footer.component.test.js | 0 .../page-container-header/index.js | 0 .../page-container-header.component.js | 0 .../page-container-header.component.test.js | 0 .../page-container.component.js | 0 .../tests/page-container.component.test.js | 0 ui/app/components/{ => ui}/qr-code.js | 2 +- ui/app/components/{ => ui}/readonly-input.js | 0 .../{ => ui}/sender-to-recipient/index.js | 0 .../{ => ui}/sender-to-recipient/index.scss | 0 .../sender-to-recipient.component.js | 10 +- .../sender-to-recipient.constants.js | 0 ui/app/components/{ => ui}/spinner/index.js | 0 .../{ => ui}/spinner/spinner.component.js | 0 ui/app/components/{ => ui}/tabs/index.js | 0 ui/app/components/{ => ui}/tabs/index.scss | 2 +- ui/app/components/{ => ui}/tabs/tab/index.js | 0 .../components/{ => ui}/tabs/tab/index.scss | 0 .../{ => ui}/tabs/tab/tab.component.js | 0 .../{ => ui}/tabs/tabs.component.js | 0 .../components/{ => ui}/text-field/index.js | 0 .../text-field/text-field.component.js | 0 .../{ => ui}/text-field/text-field.stories.js | 2 +- .../{ => ui}/token-balance/index.js | 0 .../{ => ui}/token-balance/index.scss | 0 .../token-balance/token-balance.component.js | 0 .../token-balance/token-balance.container.js | 4 +- .../{ => ui}/token-currency-display/index.js | 0 .../token-currency-display.component.js | 4 +- .../components/{ => ui}/token-input/index.js | 0 .../tests/token-input.component.test.js | 0 .../tests/token-input.container.test.js | 0 .../token-input/token-input.component.js | 6 +- .../token-input/token-input.container.js | 2 +- ui/app/components/{ => ui}/tooltip-v2.js | 0 ui/app/components/{ => ui}/tooltip.js | 0 .../components/{ => ui}/unit-input/index.js | 0 .../components/{ => ui}/unit-input/index.scss | 0 .../tests/unit-input.component.test.js | 0 .../unit-input/unit-input.component.js | 2 +- ui/app/css/itcss/components/index.scss | 2 +- ui/app/css/itcss/components/tab-bar.scss | 68 +- ui/app/{reducers => ducks/app}/app.js | 4 +- .../confirm-transaction.duck.js | 10 +- .../confirm-transaction.duck.test.js | 2 +- ui/app/ducks/{tests => gas}/gas-duck.test.js | 16 +- ui/app/ducks/{ => gas}/gas.duck.js | 15 +- ui/app/{reducers.js => ducks/index.js} | 12 +- ui/app/{reducers => ducks/locale}/locale.js | 2 +- .../{reducers => ducks/metamask}/metamask.js | 10 +- ui/app/ducks/mock-gas-estimate-data.js | 3 - .../ducks/{tests => send}/send-duck.test.js | 2 +- ui/app/ducks/{ => send}/send.duck.js | 0 ui/app/{ => helpers}/constants/common.js | 3 + ui/app/{ => helpers}/constants/error-keys.js | 0 .../constants}/infura-conversion.json | 0 ui/app/{ => helpers/constants}/routes.js | 10 + .../{ => helpers}/constants/transactions.js | 0 .../authenticated/authenticated.component.js | 2 +- .../authenticated/authenticated.container.js | 0 .../authenticated/index.js | 0 .../higher-order-components}/i18n-provider.js | 2 +- .../initialized/index.js | 0 .../initialized/initialized.component.js | 2 +- .../initialized/initialized.container.js | 0 .../metametrics/metametrics.provider.js | 8 +- .../with-method-data/index.js | 0 .../with-method-data.component.js | 2 +- .../with-modal-props/index.js | 0 .../tests/with-modal-props.test.js | 0 .../with-modal-props/with-modal-props.js | 2 +- .../with-token-tracker/index.js | 0 .../with-token-tracker.component.js | 0 ui/app/helpers/{ => utils}/common.util.js | 0 .../{tests => utils}/common.util.test.js | 2 +- .../util.js => utils/confirm-tx.util.js} | 2 +- .../confirm-tx.util.test.js} | 2 +- ui/app/{ => helpers/utils}/conversion-util.js | 0 .../utils}/conversion-util.test.js | 0 .../helpers/{ => utils}/conversions.util.js | 2 +- ui/app/helpers/{ => utils}/formatters.js | 0 ui/{ => app/helpers/utils}/i18n-helper.js | 0 .../utils}/metametrics.util.js | 0 ui/app/{ => helpers/utils}/token-util.js | 0 .../helpers/{ => utils}/transactions.util.js | 4 +- .../transactions.util.test.js | 2 +- ui/app/{ => helpers/utils}/util.js | 5 +- ui/app/img/identicon-tardigrade.png | Bin 141119 -> 0 bytes ui/app/img/identicon-walrus.png | Bin 388973 -> 0 bytes ui/app/keychains/hd/create-vault-complete.js | 91 - ui/app/keychains/hd/restore-vault.js | 181 -- .../pages/add-token/add-token.component.js | 10 +- .../pages/add-token/add-token.container.js | 2 +- .../{components => }/pages/add-token/index.js | 0 .../pages/add-token/index.scss | 2 +- .../pages/add-token/token-list/index.js | 0 .../pages/add-token/token-list/index.scss | 2 +- .../token-list-placeholder/index.js | 0 .../token-list-placeholder/index.scss | 0 .../token-list-placeholder.component.js | 0 .../token-list/token-list.component.js | 0 .../token-list/token-list.container.js | 0 .../pages/add-token/token-search/index.js | 0 .../token-search/token-search.component.js | 2 +- .../{components => }/pages/add-token/util.js | 0 .../confirm-add-suggested-token.component.js | 8 +- .../confirm-add-suggested-token.container.js | 2 +- .../confirm-add-suggested-token/index.js | 0 .../confirm-add-token.component.js | 8 +- .../confirm-add-token.container.js | 2 +- .../pages/confirm-add-token/index.js | 0 .../pages/confirm-add-token/index.scss | 0 .../confirm-approve.component.js | 0 .../confirm-approve.container.js | 2 +- .../pages/confirm-approve/index.js | 0 .../confirm-deploy-contract.component.js | 0 .../confirm-deploy-contract.container.js | 0 .../pages/confirm-deploy-contract/index.js | 0 .../confirm-send-ether.component.js | 2 +- .../confirm-send-ether.container.js | 4 +- .../pages/confirm-send-ether/index.js | 0 .../confirm-send-token.component.js | 2 +- .../confirm-send-token.container.js | 8 +- .../pages/confirm-send-token/index.js | 0 ...onfirm-token-transaction-base.component.js | 8 +- ...onfirm-token-transaction-base.container.js | 2 +- .../confirm-token-transaction-base/index.js | 0 .../confirm-transaction-base.component.js | 36 +- .../confirm-transaction-base.container.js | 18 +- .../pages/confirm-transaction-base/index.js | 0 ...confirm-transaction-base.component.test.js | 0 .../confirm-transaction-switch.component.js | 8 +- .../confirm-transaction-switch.container.js | 0 .../confirm-transaction-switch.util.js | 0 .../pages/confirm-transaction-switch/index.js | 0 .../confirm-transaction}/conf-tx.js | 12 +- .../confirm-transaction.component.js | 6 +- .../confirm-transaction.container.js | 8 +- .../pages/confirm-transaction/index.js | 0 .../connect-hardware/account-list.js | 4 +- .../connect-hardware/connect-screen.js | 2 +- .../create-account/connect-hardware/index.js | 12 +- .../create-account/import-account/index.js | 0 .../create-account/import-account/json.js | 8 +- .../import-account/private-key.js | 8 +- .../create-account/import-account/seed.js | 0 .../pages/create-account/index.js | 6 +- .../pages/create-account/new-account.js | 6 +- .../create-password.component.js | 6 +- .../create-password.container.js | 0 .../import-with-seed-phrase.component.js | 8 +- .../import-with-seed-phrase/index.js | 0 .../first-time-flow/create-password/index.js | 0 .../create-password/new-account/index.js | 0 .../new-account/new-account.component.js | 6 +- .../create-password/unique-image/index.js | 0 .../unique-image/unique-image.component.js | 4 +- .../unique-image/unique-image.container.js | 0 .../end-of-flow/end-of-flow.component.js | 4 +- .../end-of-flow/end-of-flow.container.js | 2 +- .../first-time-flow/end-of-flow/index.js | 0 .../first-time-flow/end-of-flow/index.scss | 0 .../first-time-flow-switch.component.js | 2 +- .../first-time-flow-switch.container.js | 0 .../first-time-flow-switch/index.js | 0 .../first-time-flow.component.js | 2 +- .../first-time-flow.container.js | 2 +- .../first-time-flow.selectors.js | 2 +- .../pages/first-time-flow/index.js | 0 .../pages/first-time-flow/index.scss | 10 +- .../metametrics-opt-in/index.js | 0 .../metametrics-opt-in/index.scss | 0 .../metametrics-opt-in.component.js | 4 +- .../metametrics-opt-in.container.js | 2 +- .../confirm-seed-phrase.component.js | 6 +- .../confirm-seed-phrase.state.js | 0 .../seed-phrase/confirm-seed-phrase/index.js | 0 .../confirm-seed-phrase/index.scss | 0 .../first-time-flow/seed-phrase/index.js | 0 .../first-time-flow/seed-phrase/index.scss | 4 +- .../seed-phrase/reveal-seed-phrase/index.js | 0 .../seed-phrase/reveal-seed-phrase/index.scss | 0 .../reveal-seed-phrase.component.js | 8 +- .../seed-phrase/seed-phrase.component.js | 2 +- .../first-time-flow/select-action/index.js | 0 .../first-time-flow/select-action/index.scss | 0 .../select-action/select-action.component.js | 4 +- .../select-action/select-action.container.js | 2 +- .../pages/first-time-flow/welcome/index.js | 0 .../pages/first-time-flow/welcome/index.scss | 0 .../welcome/welcome.component.js | 6 +- .../welcome/welcome.container.js | 2 +- .../pages/home/home.component.js | 6 +- .../pages/home/home.container.js | 2 +- ui/app/{components => }/pages/home/index.js | 0 ui/app/pages/index.js | 31 + ui/app/pages/index.scss | 11 + .../pages/keychains/index.scss | 0 .../pages/keychains/restore-vault.js | 8 +- .../pages/keychains/reveal-seed.js | 8 +- ui/app/{components => }/pages/lock/index.js | 0 .../pages/lock/lock.component.js | 4 +- .../pages/lock/lock.container.js | 2 +- .../pages/mobile-sync/index.js | 10 +- .../pages => pages/notice}/notice.js | 4 +- .../pages/provider-approval/index.js | 0 .../provider-approval.component.js | 2 +- .../provider-approval.container.js | 2 +- ui/app/{app.js => pages/routes/index.js} | 76 +- .../advanced-tab/advanced-tab.component.js} | 381 +-- .../advanced-tab/advanced-tab.container.js | 48 + ui/app/pages/settings/advanced-tab/index.js | 1 + .../{components => }/pages/settings/index.js | 0 ui/app/pages/settings/index.scss | 143 + .../pages/settings/info-tab/index.js | 0 .../pages/settings/info-tab/index.scss | 0 .../settings/info-tab/info-tab.component.js | 8 +- ui/app/pages/settings/security-tab/index.js | 1 + .../security-tab/security-tab.component.js | 195 ++ .../security-tab/security-tab.container.js | 42 + .../pages/settings/settings-tab/index.js | 0 .../pages/settings/settings-tab/index.scss | 0 .../settings-tab/settings-tab.component.js | 200 ++ .../settings-tab/settings-tab.container.js | 53 + ui/app/pages/settings/settings.component.js | 137 + .../pages/unlock-page/index.js | 0 .../pages/unlock-page/index.scss | 0 .../unlock-page/unlock-page.component.js | 8 +- .../unlock-page/unlock-page.container.js | 8 +- ui/app/root.js | 34 - ui/app/selectors/confirm-transaction.js | 4 +- ui/app/selectors/custom-gas.js | 12 +- .../selectors/{tests => }/custom-gas.test.js | 2 +- ui/app/{ => selectors}/selectors.js | 18 +- ui/app/selectors/transactions.js | 4 +- ui/app/{ => store}/actions.js | 34 +- ui/app/{ => store}/store.js | 2 +- ui/index.js | 8 +- ui/lib/icon-factory.js | 2 +- ui/lib/lost-accounts-notice.js | 2 +- ui/lib/tx-helper.js | 2 +- 777 files changed, 4609 insertions(+), 3786 deletions(-) delete mode 100644 Dockerfile create mode 100644 app/images/caret-left-black.svg create mode 100644 app/images/wyre.svg delete mode 100644 app/scripts/controllers/address-book.js rename auto-changelog.sh => development/auto-changelog.sh (100%) create mode 100755 development/rollback.sh delete mode 100644 docker-compose.yml delete mode 100644 mascara/README.md delete mode 100644 mascara/example/app.js delete mode 100644 mascara/example/app/index.html delete mode 100644 mascara/example/server.js delete mode 100644 mascara/proxy/index.html delete mode 100644 mascara/server/index.js delete mode 100644 mascara/server/util.js delete mode 100644 mascara/src/background.js delete mode 100644 mascara/src/metamascara.js delete mode 100644 mascara/src/proxy.js delete mode 100644 mascara/src/ui.js delete mode 100644 mascara/test/helpers.js delete mode 100644 mascara/test/index.js delete mode 100644 mascara/test/jquery-3.1.0.min.js delete mode 100644 mascara/test/test-ui.js delete mode 100644 mascara/test/util/mascara-test-helper.js delete mode 100644 mascara/ui/index.html delete mode 100644 test/mascara.conf.js delete mode 100644 test/unit/app/controllers/address-book-controller.js delete mode 100644 ui/.gitignore delete mode 100644 ui/app/accounts/new-account/index.js rename ui/app/components/{ => app}/account-dropdowns.js (98%) rename ui/app/components/{ => app}/account-menu/account-menu.component.js (95%) rename ui/app/components/{ => app}/account-menu/account-menu.container.js (93%) rename ui/app/components/{ => app}/account-menu/index.js (100%) rename ui/app/components/{ => app}/account-menu/index.scss (100%) rename ui/app/components/{ => app}/account-panel.js (91%) rename ui/app/components/{ => app}/add-token-button/add-token-button.component.js (100%) rename ui/app/components/{ => app}/add-token-button/index.js (100%) rename ui/app/components/{ => app}/add-token-button/index.scss (100%) rename ui/app/components/{ => app}/app-header/app-header.component.js (96%) rename ui/app/components/{ => app}/app-header/app-header.container.js (94%) rename ui/app/components/{ => app}/app-header/index.js (100%) rename ui/app/components/{ => app}/app-header/index.scss (100%) rename ui/app/components/{ => app}/bn-as-decimal-input.js (100%) rename ui/app/components/{ => app}/coinbase-form.js (96%) rename ui/app/components/{ => app}/confirm-page-container/confirm-detail-row/confirm-detail-row.component.js (96%) rename ui/app/components/{ => app}/confirm-page-container/confirm-detail-row/index.js (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-detail-row/index.scss (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-detail-row/tests/confirm-detail-row.component.test.js (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js (96%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js (97%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.js (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/confirm-page-container-warning.component.js (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/index.js (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/index.scss (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-content/index.js (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-content/index.scss (91%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.js (96%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-header/index.js (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-header/index.scss (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-navigation/confirm-page-container-navigation.component.js (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-navigation/index.js (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container-navigation/index.scss (100%) rename ui/app/components/{ => app}/confirm-page-container/confirm-page-container.component.js (96%) rename ui/app/components/{ => app}/confirm-page-container/index.js (100%) create mode 100644 ui/app/components/app/confirm-page-container/index.scss rename ui/app/components/{ => app}/copyable.js (96%) rename ui/app/components/{ => app}/customize-gas-modal/gas-modal-card.js (100%) rename ui/app/components/{ => app}/customize-gas-modal/gas-slider.js (100%) rename ui/app/components/{ => app}/customize-gas-modal/index.js (97%) rename ui/app/components/{ => app}/dropdowns/account-details-dropdown.js (95%) rename ui/app/components/{ => app}/dropdowns/components/account-dropdowns.js (97%) rename ui/app/components/{ => app}/dropdowns/components/dropdown.js (100%) rename ui/app/components/{ => app}/dropdowns/components/menu.js (100%) rename ui/app/components/{ => app}/dropdowns/components/network-dropdown-icon.js (100%) rename ui/app/components/{ => app}/dropdowns/index.js (100%) rename ui/app/components/{ => app}/dropdowns/network-dropdown.js (98%) rename ui/app/components/{ => app}/dropdowns/simple-dropdown.js (100%) rename ui/app/components/{ => app}/dropdowns/tests/dropdown.test.js (100%) rename ui/app/components/{ => app}/dropdowns/tests/menu.test.js (100%) rename ui/app/components/{ => app}/dropdowns/tests/network-dropdown-icon.test.js (100%) rename ui/app/components/{ => app}/dropdowns/tests/network-dropdown.test.js (97%) rename ui/app/components/{ => app}/dropdowns/token-menu-dropdown.js (97%) rename ui/app/components/{ => app}/ens-input.js (98%) rename ui/app/components/{ => app}/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js (90%) rename ui/app/components/{ => app}/gas-customization/advanced-gas-inputs/advanced-gas-inputs.container.js (92%) rename ui/app/components/{ => app}/gas-customization/advanced-gas-inputs/index.js (100%) rename ui/app/components/{ => app}/gas-customization/advanced-gas-inputs/index.scss (100%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js (82%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/advanced-tab-content/index.js (100%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/advanced-tab-content/index.scss (98%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/advanced-tab-content/tests/advanced-tab-content-component.test.js (95%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.js (100%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.scss (100%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/tests/time-remaining-component.test.js (92%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.component.js (100%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.utils.js (100%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content.component.js (95%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/basic-tab-content/index.js (100%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/basic-tab-content/index.scss (100%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/basic-tab-content/tests/basic-tab-content-component.test.js (95%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js (97%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js (94%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/index.js (100%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/index.scss (100%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-component.test.js (97%) rename ui/app/components/{ => app}/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js (96%) rename ui/app/components/{ => app}/gas-customization/gas-price-button-group/gas-price-button-group.component.js (96%) rename ui/app/components/{ => app}/gas-customization/gas-price-button-group/index.js (100%) rename ui/app/components/{ => app}/gas-customization/gas-price-button-group/index.scss (100%) rename ui/app/components/{ => app}/gas-customization/gas-price-button-group/tests/gas-price-button-group-component.test.js (98%) rename ui/app/components/{ => app}/gas-customization/gas-price-chart/gas-price-chart.component.js (100%) rename ui/app/components/{ => app}/gas-customization/gas-price-chart/gas-price-chart.utils.js (100%) rename ui/app/components/{ => app}/gas-customization/gas-price-chart/index.js (100%) rename ui/app/components/{ => app}/gas-customization/gas-price-chart/index.scss (100%) rename ui/app/components/{ => app}/gas-customization/gas-price-chart/tests/gas-price-chart.component.test.js (99%) rename ui/app/components/{ => app}/gas-customization/gas-slider/gas-slider.component.js (100%) rename ui/app/components/{ => app}/gas-customization/gas-slider/index.js (100%) rename ui/app/components/{ => app}/gas-customization/gas-slider/index.scss (100%) rename ui/app/components/{ => app}/gas-customization/gas.selectors.js (100%) rename ui/app/components/{ => app}/gas-customization/index.scss (100%) create mode 100644 ui/app/components/app/index.scss rename ui/app/components/{ => app}/info-box/index.js (100%) rename ui/app/components/{ => app}/info-box/index.scss (100%) rename ui/app/components/{ => app}/info-box/info-box.component.js (100%) rename ui/app/components/{ => app}/input-number.js (97%) rename ui/app/components/{ => app}/loading-network-screen/index.js (100%) rename ui/app/components/{ => app}/loading-network-screen/loading-network-screen.component.js (98%) rename ui/app/components/{ => app}/loading-network-screen/loading-network-screen.container.js (89%) rename ui/app/components/{ => app}/menu-bar/index.js (100%) rename ui/app/components/{ => app}/menu-bar/index.scss (100%) rename ui/app/components/{ => app}/menu-bar/menu-bar.component.js (64%) rename ui/app/components/{ => app}/menu-bar/menu-bar.container.js (80%) rename ui/app/components/{ => app}/menu-droppo.js (100%) rename ui/app/components/{ => app}/modal/index.js (100%) rename ui/app/components/{ => app}/modal/index.scss (96%) rename ui/app/components/{ => app}/modal/modal-content/index.js (100%) rename ui/app/components/{ => app}/modal/modal-content/index.scss (100%) rename ui/app/components/{ => app}/modal/modal-content/modal-content.component.js (100%) rename ui/app/components/{ => app}/modal/modal-content/tests/modal-content.component.test.js (100%) rename ui/app/components/{ => app}/modal/modal.component.js (98%) rename ui/app/components/{ => app}/modal/tests/modal.component.test.js (98%) rename ui/app/components/{ => app}/modals/account-details-modal.js (88%) rename ui/app/components/{ => app}/modals/account-modal-container.js (90%) rename ui/app/components/{ => app}/modals/buy-options-modal.js (95%) rename ui/app/components/{ => app}/modals/cancel-transaction/cancel-transaction-gas-fee/cancel-transaction-gas-fee.component.js (90%) rename ui/app/components/{ => app}/modals/cancel-transaction/cancel-transaction-gas-fee/index.js (100%) rename ui/app/components/{ => app}/modals/cancel-transaction/cancel-transaction-gas-fee/index.scss (100%) rename ui/app/components/{ => app}/modals/cancel-transaction/cancel-transaction-gas-fee/tests/cancel-transaction-gas-fee.component.test.js (100%) rename ui/app/components/{ => app}/modals/cancel-transaction/cancel-transaction.component.js (96%) rename ui/app/components/{ => app}/modals/cancel-transaction/cancel-transaction.container.js (84%) rename ui/app/components/{ => app}/modals/cancel-transaction/index.js (100%) rename ui/app/components/{ => app}/modals/cancel-transaction/index.scss (84%) rename ui/app/components/{ => app}/modals/cancel-transaction/tests/cancel-transaction.component.test.js (100%) rename ui/app/components/{ => app}/modals/clear-approved-origins/clear-approved-origins.component.js (100%) rename ui/app/components/{ => app}/modals/clear-approved-origins/clear-approved-origins.container.js (71%) rename ui/app/components/{ => app}/modals/clear-approved-origins/index.js (100%) rename ui/app/components/{ => app}/modals/confirm-remove-account/confirm-remove-account.component.js (93%) rename ui/app/components/{ => app}/modals/confirm-remove-account/confirm-remove-account.container.js (76%) rename ui/app/components/{ => app}/modals/confirm-remove-account/index.js (100%) rename ui/app/components/{ => app}/modals/confirm-remove-account/index.scss (100%) rename ui/app/components/{ => app}/modals/confirm-reset-account/confirm-reset-account.component.js (100%) rename ui/app/components/{ => app}/modals/confirm-reset-account/confirm-reset-account.container.js (70%) rename ui/app/components/{ => app}/modals/confirm-reset-account/index.js (100%) rename ui/app/components/{ => app}/modals/customize-gas/customize-gas.component.js (99%) rename ui/app/components/{ => app}/modals/customize-gas/customize-gas.container.js (89%) rename ui/app/components/{ => app}/modals/customize-gas/customize-gas.util.js (91%) rename ui/app/components/{ => app}/modals/customize-gas/index.js (100%) rename ui/app/components/{ => app}/modals/customize-gas/index.scss (100%) rename ui/app/components/{ => app}/modals/deposit-ether-modal.js (91%) rename ui/app/components/{ => app}/modals/edit-account-name-modal.js (94%) rename ui/app/components/{ => app}/modals/export-private-key-modal.js (94%) rename ui/app/components/{ => app}/modals/hide-token-confirmation-modal.js (95%) rename ui/app/components/{ => app}/modals/index.js (100%) create mode 100644 ui/app/components/app/modals/index.scss rename ui/app/components/{ => app}/modals/loading-network-error/index.js (100%) rename ui/app/components/{ => app}/modals/loading-network-error/loading-network-error.component.js (100%) rename ui/app/components/{ => app}/modals/loading-network-error/loading-network-error.container.js (57%) rename ui/app/components/{ => app}/modals/metametrics-opt-in-modal/index.js (100%) rename ui/app/components/{ => app}/modals/metametrics-opt-in-modal/index.scss (100%) rename ui/app/components/{ => app}/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.component.js (93%) rename ui/app/components/{ => app}/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.container.js (76%) rename ui/app/components/{ => app}/modals/modal.js (96%) rename ui/app/components/{ => app}/modals/new-account-modal.js (98%) rename ui/app/components/{ => app}/modals/notification-modal.js (97%) rename ui/app/components/{ => app}/modals/qr-scanner/index.js (100%) rename ui/app/components/{ => app}/modals/qr-scanner/index.scss (100%) rename ui/app/components/{ => app}/modals/qr-scanner/qr-scanner.component.js (96%) rename ui/app/components/{ => app}/modals/qr-scanner/qr-scanner.container.js (89%) rename ui/app/components/{ => app}/modals/reject-transactions/index.js (100%) rename ui/app/components/{ => app}/modals/reject-transactions/index.scss (100%) rename ui/app/components/{ => app}/modals/reject-transactions/reject-transactions.component.js (100%) rename ui/app/components/{ => app}/modals/reject-transactions/reject-transactions.container.js (80%) rename ui/app/components/{ => app}/modals/shapeshift-deposit-tx-modal.js (90%) rename ui/app/components/{ => app}/modals/transaction-confirmed/index.js (100%) rename ui/app/components/{ => app}/modals/transaction-confirmed/index.scss (100%) rename ui/app/components/{ => app}/modals/transaction-confirmed/transaction-confirmed.component.js (100%) rename ui/app/components/{ => app}/modals/transaction-confirmed/transaction-confirmed.container.js (57%) rename ui/app/components/{ => app}/network-display/index.js (100%) rename ui/app/components/{ => app}/network-display/index.scss (100%) rename ui/app/components/{ => app}/network-display/network-display.component.js (96%) rename ui/app/components/{ => app}/network-display/network-display.container.js (100%) rename ui/app/components/{ => app}/network.js (100%) rename ui/app/components/{ => app}/notice.js (100%) rename ui/app/components/{ => app}/provider-page-container/index.js (100%) rename ui/app/components/{ => app}/provider-page-container/index.scss (100%) rename ui/app/components/{ => app}/provider-page-container/provider-page-container-content/index.js (100%) rename ui/app/components/{ => app}/provider-page-container/provider-page-container-content/provider-page-container-content.component.js (97%) rename ui/app/components/{ => app}/provider-page-container/provider-page-container-content/provider-page-container-content.container.js (81%) rename ui/app/components/{ => app}/provider-page-container/provider-page-container-header/index.js (100%) rename ui/app/components/{ => app}/provider-page-container/provider-page-container-header/provider-page-container-header.component.js (100%) rename ui/app/components/{ => app}/provider-page-container/provider-page-container.component.js (96%) rename ui/app/components/{ => app}/selected-account/index.js (100%) rename ui/app/components/{ => app}/selected-account/index.scss (100%) rename ui/app/components/{ => app}/selected-account/selected-account.component.js (91%) rename ui/app/components/{ => app}/selected-account/selected-account.container.js (86%) rename ui/app/components/{ => app}/selected-account/tests/selected-account-component.test.js (100%) rename ui/app/components/{ => app}/send/README.md (100%) rename ui/app/components/{ => app}/send/account-list-item/account-list-item-README.md (100%) rename ui/app/components/{ => app}/send/account-list-item/account-list-item.component.js (92%) rename ui/app/components/{ => app}/send/account-list-item/account-list-item.container.js (94%) rename ui/app/components/{ => app}/send/account-list-item/index.js (100%) rename ui/app/components/{ => app}/send/account-list-item/tests/account-list-item-component.test.js (98%) rename ui/app/components/{ => app}/send/account-list-item/tests/account-list-item-container.test.js (98%) rename ui/app/components/{ => app}/send/index.js (100%) rename ui/app/components/{ => app}/send/send-content/index.js (100%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/README.md (100%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/amount-max-button/amount-max-button.component.js (100%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/amount-max-button/amount-max-button.container.js (92%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/amount-max-button/amount-max-button.selectors.js (100%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/amount-max-button/amount-max-button.utils.js (90%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/amount-max-button/index.js (100%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-component.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-container.test.js (95%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-selectors.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-utils.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/index.js (100%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/send-amount-row.component.js (96%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/send-amount-row.container.js (94%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/send-amount-row.scss (100%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/send-amount-row.selectors.js (100%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/tests/send-amount-row-component.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/tests/send-amount-row-container.test.js (97%) rename ui/app/components/{ => app}/send/send-content/send-amount-row/tests/send-amount-row-selectors.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-content.component.js (77%) rename ui/app/components/{ => app}/send/send-content/send-dropdown-list/index.js (100%) rename ui/app/components/{ => app}/send/send-content/send-dropdown-list/send-dropdown-list.component.js (95%) rename ui/app/components/{ => app}/send/send-content/send-dropdown-list/tests/send-dropdown-list-component.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-from-row/index.js (100%) rename ui/app/components/{ => app}/send/send-content/send-from-row/send-from-row.component.js (92%) rename ui/app/components/{ => app}/send/send-content/send-from-row/send-from-row.container.js (100%) rename ui/app/components/{ => app}/send/send-content/send-from-row/send-from-row.selectors.js (100%) rename ui/app/components/{ => app}/send/send-content/send-from-row/tests/send-from-row-component.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-from-row/tests/send-from-row-container.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-from-row/tests/send-from-row-selectors.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-gas-row/README.md (100%) rename ui/app/components/{ => app}/send/send-content/send-gas-row/gas-fee-display/gas-fee-display.component.js (95%) rename ui/app/components/{ => app}/send/send-content/send-gas-row/gas-fee-display/index.js (100%) rename ui/app/components/{ => app}/send/send-content/send-gas-row/gas-fee-display/test/gas-fee-display.component.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-gas-row/index.js (100%) rename ui/app/components/{ => app}/send/send-content/send-gas-row/send-gas-row.component.js (98%) rename ui/app/components/{ => app}/send/send-content/send-gas-row/send-gas-row.container.js (94%) rename ui/app/components/{ => app}/send/send-content/send-gas-row/send-gas-row.scss (100%) rename ui/app/components/{ => app}/send/send-content/send-gas-row/send-gas-row.selectors.js (100%) rename ui/app/components/{ => app}/send/send-content/send-gas-row/tests/send-gas-row-component.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-gas-row/tests/send-gas-row-container.test.js (96%) rename ui/app/components/{ => app}/send/send-content/send-gas-row/tests/send-gas-row-selectors.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-hex-data-row/index.js (100%) rename ui/app/components/{ => app}/send/send-content/send-hex-data-row/send-hex-data-row.component.js (100%) rename ui/app/components/{ => app}/send/send-content/send-hex-data-row/send-hex-data-row.container.js (92%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/index.js (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-error-message/index.js (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message-README.md (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.component.js (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.container.js (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.scss (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-error-message/tests/send-row-error-message-component.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-error-message/tests/send-row-error-message-container.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-warning-message/index.js (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.component.js (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.container.js (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.scss (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-warning-message/tests/send-row-warning-message-component.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-warning-message/tests/send-row-warning-message-container.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-wrapper-README.md (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-wrapper.component.js (90%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/send-row-wrapper.scss (100%) rename ui/app/components/{ => app}/send/send-content/send-row-wrapper/tests/send-row-wrapper-component.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-to-row/index.js (100%) rename ui/app/components/{ => app}/send/send-content/send-to-row/send-to-row-README.md (100%) rename ui/app/components/{ => app}/send/send-content/send-to-row/send-to-row.component.js (98%) rename ui/app/components/{ => app}/send/send-content/send-to-row/send-to-row.container.js (94%) rename ui/app/components/{ => app}/send/send-content/send-to-row/send-to-row.selectors.js (100%) rename ui/app/components/{ => app}/send/send-content/send-to-row/send-to-row.utils.js (87%) rename ui/app/components/{ => app}/send/send-content/send-to-row/tests/send-to-row-component.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-to-row/tests/send-to-row-container.test.js (97%) rename ui/app/components/{ => app}/send/send-content/send-to-row/tests/send-to-row-selectors.test.js (100%) rename ui/app/components/{ => app}/send/send-content/send-to-row/tests/send-to-row-utils.test.js (98%) rename ui/app/components/{ => app}/send/send-content/tests/send-content-component.test.js (95%) rename ui/app/components/{ => app}/send/send-footer/README.md (100%) rename ui/app/components/{ => app}/send/send-footer/index.js (100%) rename ui/app/components/{ => app}/send/send-footer/send-footer.component.js (96%) rename ui/app/components/{ => app}/send/send-footer/send-footer.container.js (98%) rename ui/app/components/{ => app}/send/send-footer/send-footer.scss (100%) rename ui/app/components/{ => app}/send/send-footer/send-footer.selectors.js (100%) rename ui/app/components/{ => app}/send/send-footer/send-footer.utils.js (100%) rename ui/app/components/{ => app}/send/send-footer/tests/send-footer-component.test.js (98%) rename ui/app/components/{ => app}/send/send-footer/tests/send-footer-container.test.js (99%) rename ui/app/components/{ => app}/send/send-footer/tests/send-footer-selectors.test.js (100%) rename ui/app/components/{ => app}/send/send-footer/tests/send-footer-utils.test.js (100%) rename ui/app/components/{ => app}/send/send-header/README.md (100%) rename ui/app/components/{ => app}/send/send-header/index.js (100%) rename ui/app/components/{ => app}/send/send-header/send-header.component.js (81%) rename ui/app/components/{ => app}/send/send-header/send-header.container.js (89%) rename ui/app/components/{ => app}/send/send-header/send-header.selectors.js (100%) rename ui/app/components/{ => app}/send/send-header/tests/send-header-component.test.js (92%) rename ui/app/components/{ => app}/send/send-header/tests/send-header-container.test.js (96%) rename ui/app/components/{ => app}/send/send-header/tests/send-header-selectors.test.js (100%) rename ui/app/components/{ => app}/send/send.component.js (96%) rename ui/app/components/{ => app}/send/send.constants.js (95%) rename ui/app/components/{ => app}/send/send.container.js (95%) rename ui/app/components/{ => app}/send/send.scss (100%) rename ui/app/components/{ => app}/send/send.selectors.js (97%) rename ui/app/components/{ => app}/send/send.utils.js (98%) rename ui/app/components/{ => app}/send/tests/send-component.test.js (99%) rename ui/app/components/{ => app}/send/tests/send-container.test.js (98%) rename ui/app/components/{ => app}/send/tests/send-selectors-test-data.js (100%) rename ui/app/components/{ => app}/send/tests/send-selectors.test.js (100%) rename ui/app/components/{ => app}/send/tests/send-utils.test.js (98%) rename ui/app/components/{ => app}/send/to-autocomplete.component.js (97%) rename ui/app/components/{ => app}/send/to-autocomplete/index.js (100%) rename ui/app/components/{ => app}/send/to-autocomplete/to-autocomplete.js (96%) rename ui/app/components/{ => app}/shapeshift-form.js (98%) rename ui/app/components/{ => app}/shift-list-item.js (95%) rename ui/app/components/{ => app}/sidebars/index.js (100%) rename ui/app/components/{ => app}/sidebars/index.scss (98%) rename ui/app/components/{ => app}/sidebars/sidebar-content.scss (100%) rename ui/app/components/{ => app}/sidebars/sidebar.component.js (100%) rename ui/app/components/{ => app}/sidebars/sidebar.constants.js (100%) rename ui/app/components/{ => app}/sidebars/tests/sidebars-component.test.js (100%) rename ui/app/components/{ => app}/signature-request.js (83%) create mode 100644 ui/app/components/app/tab-bar.js rename ui/app/components/{ => app}/token-cell.js (93%) rename ui/app/components/{ => app}/token-list.js (98%) rename ui/app/components/{ => app}/transaction-action/index.js (100%) rename ui/app/components/{ => app}/transaction-action/tests/transaction-action.component.test.js (100%) rename ui/app/components/{ => app}/transaction-action/transaction-action.component.js (89%) rename ui/app/components/{ => app}/transaction-activity-log/index.js (100%) rename ui/app/components/{ => app}/transaction-activity-log/index.scss (100%) rename ui/app/components/{ => app}/transaction-activity-log/tests/transaction-activity-log.component.test.js (100%) rename ui/app/components/{ => app}/transaction-activity-log/tests/transaction-activity-log.container.test.js (100%) rename ui/app/components/{ => app}/transaction-activity-log/tests/transaction-activity-log.util.test.js (100%) rename ui/app/components/{ => app}/transaction-activity-log/transaction-activity-log-icon/index.js (100%) rename ui/app/components/{ => app}/transaction-activity-log/transaction-activity-log-icon/transaction-activity-log-icon.component.js (100%) rename ui/app/components/{ => app}/transaction-activity-log/transaction-activity-log.component.js (95%) rename ui/app/components/{ => app}/transaction-activity-log/transaction-activity-log.constants.js (100%) rename ui/app/components/{ => app}/transaction-activity-log/transaction-activity-log.container.js (98%) rename ui/app/components/{ => app}/transaction-activity-log/transaction-activity-log.util.js (92%) rename ui/app/components/{ => app}/transaction-breakdown/index.js (100%) rename ui/app/components/{ => app}/transaction-breakdown/index.scss (88%) rename ui/app/components/{ => app}/transaction-breakdown/tests/transaction-breakdown.component.test.js (100%) rename ui/app/components/{ => app}/transaction-breakdown/transaction-breakdown-row/index.js (100%) rename ui/app/components/{ => app}/transaction-breakdown/transaction-breakdown-row/index.scss (100%) rename ui/app/components/{ => app}/transaction-breakdown/transaction-breakdown-row/tests/transaction-breakdown-row.component.test.js (96%) rename ui/app/components/{ => app}/transaction-breakdown/transaction-breakdown-row/transaction-breakdown-row.component.js (100%) rename ui/app/components/{ => app}/transaction-breakdown/transaction-breakdown.component.js (68%) create mode 100644 ui/app/components/app/transaction-breakdown/transaction-breakdown.container.js rename ui/app/components/{ => app}/transaction-list-item-details/index.js (100%) rename ui/app/components/{ => app}/transaction-list-item-details/index.scss (100%) rename ui/app/components/{ => app}/transaction-list-item-details/tests/transaction-list-item-details.component.test.js (95%) rename ui/app/components/{ => app}/transaction-list-item-details/transaction-list-item-details.component.js (80%) rename ui/app/components/{ => app}/transaction-list-item/index.js (100%) rename ui/app/components/{ => app}/transaction-list-item/index.scss (100%) rename ui/app/components/{ => app}/transaction-list-item/transaction-list-item.component.js (92%) rename ui/app/components/{ => app}/transaction-list-item/transaction-list-item.container.js (66%) rename ui/app/components/{ => app}/transaction-list/index.js (100%) rename ui/app/components/{ => app}/transaction-list/index.scss (95%) rename ui/app/components/{ => app}/transaction-list/transaction-list.component.js (97%) rename ui/app/components/{ => app}/transaction-list/transaction-list.container.js (82%) rename ui/app/components/{ => app}/transaction-status/index.js (100%) rename ui/app/components/{ => app}/transaction-status/index.scss (100%) rename ui/app/components/{ => app}/transaction-status/tests/transaction-status.component.test.js (94%) rename ui/app/components/{ => app}/transaction-status/transaction-status.component.js (94%) rename ui/app/components/{ => app}/transaction-view-balance/index.js (100%) rename ui/app/components/{ => app}/transaction-view-balance/index.scss (100%) rename ui/app/components/{ => app}/transaction-view-balance/tests/token-view-balance.component.test.js (95%) rename ui/app/components/{ => app}/transaction-view-balance/transaction-view-balance.component.js (93%) rename ui/app/components/{ => app}/transaction-view-balance/transaction-view-balance.container.js (93%) rename ui/app/components/{ => app}/transaction-view/index.js (100%) rename ui/app/components/{ => app}/transaction-view/index.scss (100%) rename ui/app/components/{ => app}/transaction-view/transaction-view.component.js (100%) rename ui/app/components/{ => app}/ui-migration-annoucement/index.js (100%) rename ui/app/components/{ => app}/ui-migration-annoucement/index.scss (100%) rename ui/app/components/{ => app}/ui-migration-annoucement/ui-migration-annoucement.component.js (100%) rename ui/app/components/{ => app}/ui-migration-annoucement/ui-migration-announcement.container.js (88%) rename ui/app/components/{ => app}/user-preferenced-currency-display/index.js (100%) rename ui/app/components/{ => app}/user-preferenced-currency-display/tests/user-preferenced-currency-display.component.test.js (94%) rename ui/app/components/{ => app}/user-preferenced-currency-display/tests/user-preferenced-currency-display.container.test.js (100%) rename ui/app/components/{ => app}/user-preferenced-currency-display/user-preferenced-currency-display.component.js (91%) rename ui/app/components/{ => app}/user-preferenced-currency-display/user-preferenced-currency-display.container.js (92%) rename ui/app/components/{ => app}/user-preferenced-currency-input/index.js (100%) rename ui/app/components/{ => app}/user-preferenced-currency-input/tests/user-preferenced-currency-input.component.test.js (94%) rename ui/app/components/{ => app}/user-preferenced-currency-input/tests/user-preferenced-currency-input.container.test.js (100%) rename ui/app/components/{ => app}/user-preferenced-currency-input/user-preferenced-currency-input.component.js (89%) rename ui/app/components/{ => app}/user-preferenced-currency-input/user-preferenced-currency-input.container.js (84%) rename ui/app/components/{ => app}/user-preferenced-token-input/index.js (100%) rename ui/app/components/{ => app}/user-preferenced-token-input/tests/user-preferenced-token-input.component.test.js (95%) rename ui/app/components/{ => app}/user-preferenced-token-input/tests/user-preferenced-token-input.container.test.js (100%) rename ui/app/components/{ => app}/user-preferenced-token-input/user-preferenced-token-input.component.js (90%) rename ui/app/components/{ => app}/user-preferenced-token-input/user-preferenced-token-input.container.js (84%) rename ui/app/components/{ => app}/wallet-view.js (93%) delete mode 100644 ui/app/components/confirm-page-container/index.scss delete mode 100644 ui/app/components/index.scss delete mode 100644 ui/app/components/modals/index.scss delete mode 100644 ui/app/components/pages/index.scss delete mode 100644 ui/app/components/pages/settings/index.scss delete mode 100644 ui/app/components/pages/settings/settings-tab/settings-tab.container.js delete mode 100644 ui/app/components/pages/settings/settings.component.js delete mode 100644 ui/app/components/tab-bar.js delete mode 100644 ui/app/components/transaction-breakdown/transaction-breakdown.container.js rename ui/app/components/{ => ui}/account-dropdown-mini/account-dropdown-mini.component.js (96%) rename ui/app/components/{ => ui}/account-dropdown-mini/index.js (100%) rename ui/app/components/{ => ui}/account-dropdown-mini/tests/account-dropdown-mini.component.test.js (96%) rename ui/app/components/{ => ui}/alert/index.js (100%) rename ui/app/components/{ => ui}/balance/balance.component.js (91%) rename ui/app/components/{ => ui}/balance/balance.container.js (96%) rename ui/app/components/{ => ui}/balance/index.js (100%) rename ui/app/components/{ => ui}/breadcrumbs/breadcrumbs.component.js (100%) rename ui/app/components/{ => ui}/breadcrumbs/index.js (100%) rename ui/app/components/{ => ui}/breadcrumbs/index.scss (100%) rename ui/app/components/{ => ui}/breadcrumbs/tests/breadcrumbs.component.test.js (100%) rename ui/app/components/{ => ui}/button-group/button-group.component.js (100%) rename ui/app/components/{ => ui}/button-group/button-group.stories.js (97%) rename ui/app/components/{ => ui}/button-group/index.js (100%) rename ui/app/components/{ => ui}/button-group/index.scss (100%) rename ui/app/components/{ => ui}/button-group/tests/button-group-component.test.js (100%) rename ui/app/components/{ => ui}/button/button.component.js (100%) rename ui/app/components/{ => ui}/button/button.stories.js (97%) rename ui/app/components/{ => ui}/button/index.js (100%) rename ui/app/components/{ => ui}/card/card.component.js (100%) rename ui/app/components/{ => ui}/card/index.js (100%) rename ui/app/components/{ => ui}/card/index.scss (100%) rename ui/app/components/{ => ui}/card/tests/card.component.test.js (100%) rename ui/app/components/{ => ui}/copyButton.js (100%) rename ui/app/components/{ => ui}/currency-display/currency-display.component.js (95%) rename ui/app/components/{ => ui}/currency-display/currency-display.container.js (92%) rename ui/app/components/{ => ui}/currency-display/index.js (100%) rename ui/app/components/{ => ui}/currency-display/index.scss (100%) rename ui/app/components/{ => ui}/currency-display/tests/currency-display.component.test.js (100%) rename ui/app/components/{ => ui}/currency-display/tests/currency-display.container.test.js (100%) rename ui/app/components/{ => ui}/currency-input/currency-input.component.js (97%) rename ui/app/components/{ => ui}/currency-input/currency-input.container.js (85%) rename ui/app/components/{ => ui}/currency-input/index.js (100%) rename ui/app/components/{ => ui}/currency-input/index.scss (100%) rename ui/app/components/{ => ui}/currency-input/tests/currency-input.component.test.js (100%) rename ui/app/components/{ => ui}/currency-input/tests/currency-input.container.test.js (100%) rename ui/app/components/{ => ui}/editable-label.js (100%) rename ui/app/components/{ => ui}/error-message/error-message.component.js (100%) rename ui/app/components/{ => ui}/error-message/index.js (100%) rename ui/app/components/{ => ui}/error-message/index.scss (100%) rename ui/app/components/{ => ui}/error-message/tests/error-message.component.test.js (100%) rename ui/app/components/{ => ui}/eth-balance.js (98%) rename ui/app/components/{ => ui}/export-text-container/export-text-container.component.js (95%) rename ui/app/components/{ => ui}/export-text-container/index.js (100%) rename ui/app/components/{ => ui}/export-text-container/index.scss (100%) rename ui/app/components/{ => ui}/fiat-value.js (95%) rename ui/app/components/{ => ui}/hex-to-decimal/hex-to-decimal.component.js (85%) rename ui/app/components/{ => ui}/hex-to-decimal/index.js (100%) rename ui/app/components/{ => ui}/hex-to-decimal/tests/hex-to-decimal.component.test.js (100%) rename ui/app/components/{ => ui}/identicon/identicon.component.js (94%) rename ui/app/components/{ => ui}/identicon/identicon.container.js (100%) rename ui/app/components/{ => ui}/identicon/index.js (100%) rename ui/app/components/{ => ui}/identicon/index.scss (100%) rename ui/app/components/{ => ui}/identicon/tests/identicon.component.test.js (100%) rename ui/app/components/{ => ui}/jazzicon/index.js (100%) rename ui/app/components/{ => ui}/jazzicon/jazzicon.component.js (96%) rename ui/app/components/{ => ui}/loading-screen/index.js (100%) rename ui/app/components/{ => ui}/loading-screen/loading-screen.component.js (100%) rename ui/app/components/{ => ui}/lock-icon/index.js (100%) rename ui/app/components/{ => ui}/lock-icon/lock-icon.component.js (100%) rename ui/app/components/{ => ui}/mascot.js (100%) rename ui/app/components/{ => ui}/page-container/index.js (100%) rename ui/app/components/{ => ui}/page-container/index.scss (100%) rename ui/app/components/{ => ui}/page-container/page-container-content.component.js (100%) rename ui/app/components/{ => ui}/page-container/page-container-footer/index.js (100%) rename ui/app/components/{ => ui}/page-container/page-container-footer/page-container-footer.component.js (100%) rename ui/app/components/{ => ui}/page-container/page-container-footer/tests/page-container-footer.component.test.js (100%) rename ui/app/components/{ => ui}/page-container/page-container-header/index.js (100%) rename ui/app/components/{ => ui}/page-container/page-container-header/page-container-header.component.js (100%) rename ui/app/components/{ => ui}/page-container/page-container-header/tests/page-container-header.component.test.js (100%) rename ui/app/components/{ => ui}/page-container/page-container.component.js (100%) rename ui/app/components/{ => ui}/page-container/tests/page-container.component.test.js (100%) rename ui/app/components/{ => ui}/qr-code.js (96%) rename ui/app/components/{ => ui}/readonly-input.js (100%) rename ui/app/components/{ => ui}/sender-to-recipient/index.js (100%) rename ui/app/components/{ => ui}/sender-to-recipient/index.scss (100%) rename ui/app/components/{ => ui}/sender-to-recipient/sender-to-recipient.component.js (96%) rename ui/app/components/{ => ui}/sender-to-recipient/sender-to-recipient.constants.js (100%) rename ui/app/components/{ => ui}/spinner/index.js (100%) rename ui/app/components/{ => ui}/spinner/spinner.component.js (100%) rename ui/app/components/{ => ui}/tabs/index.js (100%) rename ui/app/components/{ => ui}/tabs/index.scss (88%) rename ui/app/components/{ => ui}/tabs/tab/index.js (100%) rename ui/app/components/{ => ui}/tabs/tab/index.scss (100%) rename ui/app/components/{ => ui}/tabs/tab/tab.component.js (100%) rename ui/app/components/{ => ui}/tabs/tabs.component.js (100%) rename ui/app/components/{ => ui}/text-field/index.js (100%) rename ui/app/components/{ => ui}/text-field/text-field.component.js (100%) rename ui/app/components/{ => ui}/text-field/text-field.stories.js (96%) rename ui/app/components/{ => ui}/token-balance/index.js (100%) rename ui/app/components/{ => ui}/token-balance/index.scss (100%) rename ui/app/components/{ => ui}/token-balance/token-balance.component.js (100%) rename ui/app/components/{ => ui}/token-balance/token-balance.container.js (69%) rename ui/app/components/{ => ui}/token-currency-display/index.js (100%) rename ui/app/components/{ => ui}/token-currency-display/token-currency-display.component.js (89%) rename ui/app/components/{ => ui}/token-input/index.js (100%) rename ui/app/components/{ => ui}/token-input/tests/token-input.component.test.js (100%) rename ui/app/components/{ => ui}/token-input/tests/token-input.container.test.js (100%) rename ui/app/components/{ => ui}/token-input/token-input.component.js (94%) rename ui/app/components/{ => ui}/token-input/token-input.container.js (93%) rename ui/app/components/{ => ui}/tooltip-v2.js (100%) rename ui/app/components/{ => ui}/tooltip.js (100%) rename ui/app/components/{ => ui}/unit-input/index.js (100%) rename ui/app/components/{ => ui}/unit-input/index.scss (100%) rename ui/app/components/{ => ui}/unit-input/tests/unit-input.component.test.js (100%) rename ui/app/components/{ => ui}/unit-input/unit-input.component.js (97%) rename ui/app/{reducers => ducks/app}/app.js (99%) rename ui/app/ducks/{ => confirm-transaction}/confirm-transaction.duck.js (97%) rename ui/app/ducks/{tests => confirm-transaction}/confirm-transaction.duck.test.js (99%) rename ui/app/ducks/{tests => gas}/gas-duck.test.js (98%) rename ui/app/ducks/{ => gas}/gas.duck.js (98%) rename ui/app/{reducers.js => ducks/index.js} (85%) rename ui/app/{reducers => ducks/locale}/locale.js (88%) rename ui/app/{reducers => ducks/metamask}/metamask.js (96%) delete mode 100644 ui/app/ducks/mock-gas-estimate-data.js rename ui/app/ducks/{tests => send}/send-duck.test.js (99%) rename ui/app/ducks/{ => send}/send.duck.js (100%) rename ui/app/{ => helpers}/constants/common.js (76%) rename ui/app/{ => helpers}/constants/error-keys.js (100%) rename ui/app/{ => helpers/constants}/infura-conversion.json (100%) rename ui/app/{ => helpers/constants}/routes.js (90%) rename ui/app/{ => helpers}/constants/transactions.js (100%) rename ui/app/{ => helpers}/higher-order-components/authenticated/authenticated.component.js (88%) rename ui/app/{ => helpers}/higher-order-components/authenticated/authenticated.container.js (100%) rename ui/app/{ => helpers}/higher-order-components/authenticated/index.js (100%) rename ui/app/{ => helpers/higher-order-components}/i18n-provider.js (96%) rename ui/app/{ => helpers}/higher-order-components/initialized/index.js (100%) rename ui/app/{ => helpers}/higher-order-components/initialized/initialized.component.js (85%) rename ui/app/{ => helpers}/higher-order-components/initialized/initialized.container.js (100%) rename ui/app/{ => helpers/higher-order-components}/metametrics/metametrics.provider.js (93%) rename ui/app/{ => helpers}/higher-order-components/with-method-data/index.js (100%) rename ui/app/{ => helpers}/higher-order-components/with-method-data/with-method-data.component.js (95%) rename ui/app/{ => helpers}/higher-order-components/with-modal-props/index.js (100%) rename ui/app/{ => helpers}/higher-order-components/with-modal-props/tests/with-modal-props.test.js (100%) rename ui/app/{ => helpers}/higher-order-components/with-modal-props/with-modal-props.js (89%) rename ui/app/{ => helpers}/higher-order-components/with-token-tracker/index.js (100%) rename ui/app/{ => helpers}/higher-order-components/with-token-tracker/with-token-tracker.component.js (100%) rename ui/app/helpers/{ => utils}/common.util.js (100%) rename ui/app/helpers/{tests => utils}/common.util.test.js (93%) rename ui/app/helpers/{confirm-transaction/util.js => utils/confirm-tx.util.js} (99%) rename ui/app/helpers/{confirm-transaction/util.test.js => utils/confirm-tx.util.test.js} (98%) rename ui/app/{ => helpers/utils}/conversion-util.js (100%) rename ui/app/{ => helpers/utils}/conversion-util.test.js (100%) rename ui/app/helpers/{ => utils}/conversions.util.js (97%) rename ui/app/helpers/{ => utils}/formatters.js (100%) rename ui/{ => app/helpers/utils}/i18n-helper.js (100%) rename ui/app/{metametrics => helpers/utils}/metametrics.util.js (100%) rename ui/app/{ => helpers/utils}/token-util.js (100%) rename ui/app/helpers/{ => utils}/transactions.util.js (97%) rename ui/app/helpers/{tests => utils}/transactions.util.test.js (97%) rename ui/app/{ => helpers/utils}/util.js (97%) delete mode 100644 ui/app/img/identicon-tardigrade.png delete mode 100644 ui/app/img/identicon-walrus.png delete mode 100644 ui/app/keychains/hd/create-vault-complete.js delete mode 100644 ui/app/keychains/hd/restore-vault.js rename ui/app/{components => }/pages/add-token/add-token.component.js (96%) rename ui/app/{components => }/pages/add-token/add-token.container.js (97%) rename ui/app/{components => }/pages/add-token/index.js (100%) rename ui/app/{components => }/pages/add-token/index.scss (95%) rename ui/app/{components => }/pages/add-token/token-list/index.js (100%) rename ui/app/{components => }/pages/add-token/token-list/index.scss (96%) rename ui/app/{components => }/pages/add-token/token-list/token-list-placeholder/index.js (100%) rename ui/app/{components => }/pages/add-token/token-list/token-list-placeholder/index.scss (100%) rename ui/app/{components => }/pages/add-token/token-list/token-list-placeholder/token-list-placeholder.component.js (100%) rename ui/app/{components => }/pages/add-token/token-list/token-list.component.js (100%) rename ui/app/{components => }/pages/add-token/token-list/token-list.container.js (100%) rename ui/app/{components => }/pages/add-token/token-search/index.js (100%) rename ui/app/{components => }/pages/add-token/token-search/token-search.component.js (97%) rename ui/app/{components => }/pages/add-token/util.js (100%) rename ui/app/{components => }/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js (94%) rename ui/app/{components => }/pages/confirm-add-suggested-token/confirm-add-suggested-token.container.js (91%) rename ui/app/{components => }/pages/confirm-add-suggested-token/index.js (100%) rename ui/app/{components => }/pages/confirm-add-token/confirm-add-token.component.js (93%) rename ui/app/{components => }/pages/confirm-add-token/confirm-add-token.container.js (86%) rename ui/app/{components => }/pages/confirm-add-token/index.js (100%) rename ui/app/{components => }/pages/confirm-add-token/index.scss (100%) rename ui/app/{components => }/pages/confirm-approve/confirm-approve.component.js (100%) rename ui/app/{components => }/pages/confirm-approve/confirm-approve.container.js (80%) rename ui/app/{components => }/pages/confirm-approve/index.js (100%) rename ui/app/{components => }/pages/confirm-deploy-contract/confirm-deploy-contract.component.js (100%) rename ui/app/{components => }/pages/confirm-deploy-contract/confirm-deploy-contract.container.js (100%) rename ui/app/{components => }/pages/confirm-deploy-contract/index.js (100%) rename ui/app/{components => }/pages/confirm-send-ether/confirm-send-ether.component.js (93%) rename ui/app/{components => }/pages/confirm-send-ether/confirm-send-ether.container.js (86%) rename ui/app/{components => }/pages/confirm-send-ether/index.js (100%) rename ui/app/{components => }/pages/confirm-send-token/confirm-send-token.component.js (92%) rename ui/app/{components => }/pages/confirm-send-token/confirm-send-token.container.js (87%) rename ui/app/{components => }/pages/confirm-send-token/index.js (100%) rename ui/app/{components => }/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js (91%) rename ui/app/{components => }/pages/confirm-token-transaction-base/confirm-token-transaction-base.container.js (95%) rename ui/app/{components => }/pages/confirm-token-transaction-base/index.js (100%) rename ui/app/{components => }/pages/confirm-transaction-base/confirm-transaction-base.component.js (93%) rename ui/app/{components => }/pages/confirm-transaction-base/confirm-transaction-base.container.js (92%) rename ui/app/{components => }/pages/confirm-transaction-base/index.js (100%) rename ui/app/{components => }/pages/confirm-transaction-base/tests/confirm-transaction-base.component.test.js (100%) rename ui/app/{components => }/pages/confirm-transaction-switch/confirm-transaction-switch.component.js (92%) rename ui/app/{components => }/pages/confirm-transaction-switch/confirm-transaction-switch.container.js (100%) rename ui/app/{components => }/pages/confirm-transaction-switch/confirm-transaction-switch.util.js (100%) rename ui/app/{components => }/pages/confirm-transaction-switch/index.js (100%) rename ui/app/{ => pages/confirm-transaction}/conf-tx.js (94%) rename ui/app/{components => }/pages/confirm-transaction/confirm-transaction.component.js (97%) rename ui/app/{components => }/pages/confirm-transaction/confirm-transaction.container.js (79%) rename ui/app/{components => }/pages/confirm-transaction/index.js (100%) rename ui/app/{components => }/pages/create-account/connect-hardware/account-list.js (98%) rename ui/app/{components => }/pages/create-account/connect-hardware/connect-screen.js (99%) rename ui/app/{components => }/pages/create-account/connect-hardware/index.js (95%) rename ui/app/{components => }/pages/create-account/import-account/index.js (100%) rename ui/app/{components => }/pages/create-account/import-account/json.js (94%) rename ui/app/{components => }/pages/create-account/import-account/private-key.js (93%) rename ui/app/{components => }/pages/create-account/import-account/seed.js (100%) rename ui/app/{components => }/pages/create-account/index.js (95%) rename ui/app/{components => }/pages/create-account/new-account.js (95%) rename ui/app/{components => }/pages/first-time-flow/create-password/create-password.component.js (93%) rename ui/app/{components => }/pages/first-time-flow/create-password/create-password.container.js (100%) rename ui/app/{components => }/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js (96%) rename ui/app/{components => }/pages/first-time-flow/create-password/import-with-seed-phrase/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/create-password/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/create-password/new-account/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/create-password/new-account/new-account.component.js (97%) rename ui/app/{components => }/pages/first-time-flow/create-password/unique-image/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/create-password/unique-image/unique-image.component.js (90%) rename ui/app/{components => }/pages/first-time-flow/create-password/unique-image/unique-image.container.js (100%) rename ui/app/{components => }/pages/first-time-flow/end-of-flow/end-of-flow.component.js (96%) rename ui/app/{components => }/pages/first-time-flow/end-of-flow/end-of-flow.container.js (89%) rename ui/app/{components => }/pages/first-time-flow/end-of-flow/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/end-of-flow/index.scss (100%) rename ui/app/{components => }/pages/first-time-flow/first-time-flow-switch/first-time-flow-switch.component.js (97%) rename ui/app/{components => }/pages/first-time-flow/first-time-flow-switch/first-time-flow-switch.container.js (100%) rename ui/app/{components => }/pages/first-time-flow/first-time-flow-switch/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/first-time-flow.component.js (99%) rename ui/app/{components => }/pages/first-time-flow/first-time-flow.container.js (97%) rename ui/app/{components => }/pages/first-time-flow/first-time-flow.selectors.js (93%) rename ui/app/{components => }/pages/first-time-flow/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/index.scss (93%) rename ui/app/{components => }/pages/first-time-flow/metametrics-opt-in/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/metametrics-opt-in/index.scss (100%) rename ui/app/{components => }/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.component.js (97%) rename ui/app/{components => }/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.container.js (92%) rename ui/app/{components => }/pages/first-time-flow/seed-phrase/confirm-seed-phrase/confirm-seed-phrase.component.js (96%) rename ui/app/{components => }/pages/first-time-flow/seed-phrase/confirm-seed-phrase/confirm-seed-phrase.state.js (100%) rename ui/app/{components => }/pages/first-time-flow/seed-phrase/confirm-seed-phrase/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/seed-phrase/confirm-seed-phrase/index.scss (100%) rename ui/app/{components => }/pages/first-time-flow/seed-phrase/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/seed-phrase/index.scss (87%) rename ui/app/{components => }/pages/first-time-flow/seed-phrase/reveal-seed-phrase/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/seed-phrase/reveal-seed-phrase/index.scss (100%) rename ui/app/{components => }/pages/first-time-flow/seed-phrase/reveal-seed-phrase/reveal-seed-phrase.component.js (95%) rename ui/app/{components => }/pages/first-time-flow/seed-phrase/seed-phrase.component.js (97%) rename ui/app/{components => }/pages/first-time-flow/select-action/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/select-action/index.scss (100%) rename ui/app/{components => }/pages/first-time-flow/select-action/select-action.component.js (97%) rename ui/app/{components => }/pages/first-time-flow/select-action/select-action.container.js (90%) rename ui/app/{components => }/pages/first-time-flow/welcome/index.js (100%) rename ui/app/{components => }/pages/first-time-flow/welcome/index.scss (100%) rename ui/app/{components => }/pages/first-time-flow/welcome/welcome.component.js (91%) rename ui/app/{components => }/pages/first-time-flow/welcome/welcome.container.js (90%) rename ui/app/{components => }/pages/home/home.component.js (91%) rename ui/app/{components => }/pages/home/home.container.js (87%) rename ui/app/{components => }/pages/home/index.js (100%) create mode 100644 ui/app/pages/index.js create mode 100644 ui/app/pages/index.scss rename ui/app/{components => }/pages/keychains/index.scss (100%) rename ui/app/{components => }/pages/keychains/restore-vault.js (96%) rename ui/app/{components => }/pages/keychains/reveal-seed.js (94%) rename ui/app/{components => }/pages/lock/index.js (100%) rename ui/app/{components => }/pages/lock/lock.component.js (81%) rename ui/app/{components => }/pages/lock/lock.container.js (90%) rename ui/app/{components => }/pages/mobile-sync/index.js (97%) rename ui/app/{components/pages => pages/notice}/notice.js (97%) rename ui/app/{components => }/pages/provider-approval/index.js (100%) rename ui/app/{components => }/pages/provider-approval/provider-approval.component.js (91%) rename ui/app/{components => }/pages/provider-approval/provider-approval.container.js (95%) rename ui/app/{app.js => pages/routes/index.js} (85%) rename ui/app/{components/pages/settings/settings-tab/settings-tab.component.js => pages/settings/advanced-tab/advanced-tab.component.js} (51%) create mode 100644 ui/app/pages/settings/advanced-tab/advanced-tab.container.js create mode 100644 ui/app/pages/settings/advanced-tab/index.js rename ui/app/{components => }/pages/settings/index.js (100%) create mode 100644 ui/app/pages/settings/index.scss rename ui/app/{components => }/pages/settings/info-tab/index.js (100%) rename ui/app/{components => }/pages/settings/info-tab/index.scss (100%) rename ui/app/{components => }/pages/settings/info-tab/info-tab.component.js (97%) create mode 100644 ui/app/pages/settings/security-tab/index.js create mode 100644 ui/app/pages/settings/security-tab/security-tab.component.js create mode 100644 ui/app/pages/settings/security-tab/security-tab.container.js rename ui/app/{components => }/pages/settings/settings-tab/index.js (100%) rename ui/app/{components => }/pages/settings/settings-tab/index.scss (100%) create mode 100644 ui/app/pages/settings/settings-tab/settings-tab.component.js create mode 100644 ui/app/pages/settings/settings-tab/settings-tab.container.js create mode 100644 ui/app/pages/settings/settings.component.js rename ui/app/{components => }/pages/unlock-page/index.js (100%) rename ui/app/{components => }/pages/unlock-page/index.scss (100%) rename ui/app/{components => }/pages/unlock-page/unlock-page.component.js (95%) rename ui/app/{components => }/pages/unlock-page/unlock-page.container.js (86%) delete mode 100644 ui/app/root.js rename ui/app/selectors/{tests => }/custom-gas.test.js (99%) rename ui/app/{ => selectors}/selectors.js (94%) rename ui/app/{ => store}/actions.js (98%) rename ui/app/{ => store}/store.js (93%) diff --git a/.babelrc b/.babelrc index 9b1d5409bc17..cfa759dd9047 100644 --- a/.babelrc +++ b/.babelrc @@ -1,4 +1,23 @@ { - "presets": [["env", { "targets": { "browsers": [">0.25%", "not ie 11", "not op_mini all"] } } ], "react", "stage-0"], - "plugins": ["transform-runtime", "transform-async-to-generator", "transform-class-properties"] -} + "presets": [ + [ + "env", + { + "targets": { + "browsers": [ + ">0.25%", + "not ie 11", + "not op_mini all" + ] + } + } + ], + "react", + "stage-0" + ], + "plugins": [ + "transform-runtime", + "transform-async-to-generator", + "transform-class-properties" + ] +} \ No newline at end of file diff --git a/.circleci/config.yml b/.circleci/config.yml index cf5afc3a86eb..807ed042c79b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -82,28 +82,21 @@ workflows: jobs: prep-deps-npm: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - - restore_cache: - keys: - - v1.0-dependency-cache-{{ checksum "package-lock.json" }} - run: - name: Install npm 6 + deps via npm + name: Install deps via npm command: | - sudo npm install -g npm@6 && npm install --no-save --no-audit + npm ci - persist_to_workspace: root: . paths: - node_modules - - save_cache: - key: v1.0-dependency-cache-{{ checksum "package-lock.json" }} - paths: - - node_modules prep-build: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - attach_workspace: @@ -122,7 +115,7 @@ jobs: prep-docs: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - attach_workspace: @@ -137,7 +130,7 @@ jobs: prep-scss: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - attach_workspace: @@ -156,7 +149,7 @@ jobs: test-lint: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - attach_workspace: @@ -191,7 +184,7 @@ jobs: # destination: test-artifacts test-e2e-chrome: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - attach_workspace: @@ -205,7 +198,7 @@ jobs: test-e2e-firefox: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - run: @@ -222,7 +215,7 @@ jobs: job-screens: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - attach_workspace: @@ -237,7 +230,7 @@ jobs: job-publish-prerelease: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - attach_workspace: @@ -257,7 +250,7 @@ jobs: job-publish-release: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - attach_workspace: @@ -274,7 +267,7 @@ jobs: test-unit: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - attach_workspace: @@ -284,7 +277,7 @@ jobs: command: npm run test:coverage test-mozilla-lint: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - attach_workspace: @@ -295,7 +288,7 @@ jobs: test-integration-flat-firefox: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - attach_workspace: @@ -311,7 +304,7 @@ jobs: environment: browsers: '["Chrome"]' docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - checkout - attach_workspace: @@ -320,36 +313,9 @@ jobs: name: test:integration:flat command: npm run test:flat - test-integration-mascara-firefox: - docker: - - image: circleci/node:8.11.3-browsers - steps: - - checkout - - attach_workspace: - at: . - - run: - name: Install Firefox - command: ./.circleci/scripts/firefox-install - - run: - name: test:integration:mascara - command: npm run test:mascara - - test-integration-mascara-chrome: - environment: - browsers: '["Chrome"]' - docker: - - image: circleci/node:8.11.3-browsers - steps: - - checkout - - attach_workspace: - at: . - - run: - name: test:integration:mascara - command: npm run test:mascara - all-tests-pass: docker: - - image: circleci/node:8.11.3-browsers + - image: circleci/node:8.15.1-browsers steps: - run: name: All Tests Passed diff --git a/.eslintignore b/.eslintignore index f96d39a168a0..5923e1bc214d 100644 --- a/.eslintignore +++ b/.eslintignore @@ -14,9 +14,6 @@ app/vendor/** ui/lib/blockies.js -mascara/src/app/first-time/spinner.js -mascara/test/jquery-3.1.0.min.js - test/integration/bundle.js test/integration/jquery-3.1.0.min.js test/integration/helpers.js diff --git a/.nvmrc b/.nvmrc index 812d970dc98d..9235dd0adaa1 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v8.13 +v8.15 diff --git a/.stylelintignore b/.stylelintignore index 854829a546a6..a42709a90e0b 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -4,7 +4,6 @@ dist/ docs/ fonts/ images/ -mascara/ node_modules/ notices/ test/ diff --git a/CHANGELOG.md b/CHANGELOG.md index bf897c864d75..bada9b8b5973 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,30 @@ ## Current Develop Branch +## 6.3.0 Mon Mar 25 2019 + +- [#6300](https://github.com/MetaMask/metamask-extension/pull/6300): Gas chart hidden on custom networks +- [#6301](https://github.com/MetaMask/metamask-extension/pull/6301): Fix gas fee in the submitted step of the transaction details activity log +- [#6302](https://github.com/MetaMask/metamask-extension/pull/6302): Replaces the coinbase link in the deposit modal with one for wyre +- [#6307](https://github.com/MetaMask/metamask-extension/pull/6307): Centre the notification in the current window +- [#6312](https://github.com/MetaMask/metamask-extension/pull/6312): Fixes popups not showing when screen size is odd +- [#6326](https://github.com/MetaMask/metamask-extension/pull/6326): Fix oversized loading overlay on gas customization modal. +- [#6330](https://github.com/MetaMask/metamask-extension/pull/6330): Stop reloading dapps on network change allowing dapps to decide if it should refresh or not +- [#6332](https://github.com/MetaMask/metamask-extension/pull/6332): Enable mobile sync +- [#6333](https://github.com/MetaMask/metamask-extension/pull/6333): Redesign of the settings screen +- [#6340](https://github.com/MetaMask/metamask-extension/pull/6340): Cancel transactions and signature requests on the closing of notification windows +- [#6341](https://github.com/MetaMask/metamask-extension/pull/6341): Disable transaction "Cancel" button when balance is insufficient +- [#6347](https://github.com/MetaMask/metamask-extension/pull/6347): Enable privacy mode by default for first time users + +## 6.2.2 Tue Mar 12 2019 + +- [#6271](https://github.com/MetaMask/metamask-extension/pull/6271): Centre all notification popups +- [#6268](https://github.com/MetaMask/metamask-extension/pull/6268): Improve Korean translations +- [#6279](https://github.com/MetaMask/metamask-extension/pull/6279): Nonmultiple notifications for batch txs +- [#6280](https://github.com/MetaMask/metamask-extension/pull/6280): No longer check network when validating checksum addresses + +## 6.2.1 Wed Mar 06 2019 + ## 6.2.0 Tue Mar 05 2019 - [#6192](https://github.com/MetaMask/metamask-extension/pull/6192): Improves design and UX of onboarding flow - [#6195](https://github.com/MetaMask/metamask-extension/pull/6195): Fixes gas estimation when sending to contracts @@ -12,7 +36,7 @@ - [#6182](https://github.com/MetaMask/metamask-extension/pull/6182): Change "Token Address" to "Token Contract Address" - [#6177](https://github.com/MetaMask/metamask-extension/pull/6177): Fixes #6176 -- [#6146](https://github.com/MetaMask/metamask-extension/pull/6146): * Add Copy Tx ID button to transaction-list-item-details +- [#6146](https://github.com/MetaMask/metamask-extension/pull/6146): * Add Copy Tx ID button to transaction-list-item-details - [#6133](https://github.com/MetaMask/metamask-extension/pull/6133): Checksum address before slicing it for the confirm screen - [#6147](https://github.com/MetaMask/metamask-extension/pull/6147): Add button to force edit token symbol when adding custom token - [#6124](https://github.com/MetaMask/metamask-extension/pull/6124): recent-blocks - dont listen for block when on infura providers diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index f9ec6293589a..000000000000 --- a/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM node:7 -MAINTAINER kumavis - -# setup app dir -RUN mkdir -p /www/ -WORKDIR /www/ - -# install dependencies -COPY ./package.json /www/package.json -# RUN npm install -g node-gyp -RUN npm install >> npm_log 2>> npm_err || true - -RUN cat npm_log && cat npm_err - -# copy over app dir -COPY ./ /www/ - -# run tests -# RUN npm test - -# build app -RUN npm run dist - -# start server -CMD node mascara/example/server.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 3d2cd35bd096..eab243b8a5ed 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -11,6 +11,9 @@ "exposeDescription": { "message": "Expose accounts to the current website. Useful for legacy dapps." }, + "chartOnlyAvailableEth": { + "message": "Chart only available on Ethereum networks." + }, "confirmExpose": { "message": "Are you sure you want to expose your accounts to the current website?" }, @@ -41,6 +44,9 @@ "providerRequestInfo": { "message": "This site is requesting access to view your current account address. Always make sure you trust the sites you interact with." }, + "aboutUs": { + "message": "About Us" + }, "accept": { "message": "Accept" }, @@ -71,6 +77,12 @@ "address": { "message": "Address" }, + "advanced": { + "message": "Advanced" + }, + "advancedSettingsDescription": { + "message": "Access developer features, download State Logs, Reset Account, setup testnets and custom RPC." + }, "advancedOptions": { "message": "Advanced Options" }, @@ -89,9 +101,6 @@ "addAcquiredTokens": { "message": "Add the tokens you've acquired using MetaMask" }, - "advanced": { - "message": "Advanced" - }, "agreeTermsOfService": { "message": "I agree to the Terms of Service" }, @@ -188,6 +197,12 @@ "buyCoinbaseExplainer": { "message": "Coinbase is the world’s most popular way to buy and sell Bitcoin, Ethereum, and Litecoin." }, + "buyWithWyre": { + "message": "Buy ETH with Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre lets you use aa credit card to deposit ETH right in to your MetaMask account. From the Airswap website, click \"Use Fiat\" in the top-right corner. You can also use Airswap to get started with ERC 20 tokens!" + }, "bytes": { "message": "Bytes" }, @@ -227,6 +242,9 @@ "chromeRequiredForHardwareWallets": { "message": "You need to use MetaMask on Google Chrome in order to connect to your Hardware Wallet." }, + "company": { + "message": "Company" + }, "confirm": { "message": "Confirm" }, @@ -293,6 +311,9 @@ "continueToCoinbase": { "message": "Continue to Coinbase" }, + "continueToWyre": { + "message": "Continue to Wyre" + }, "contractDeployment": { "message": "Contract Deployment" }, @@ -607,6 +628,12 @@ "gasPriceRequired": { "message": "Gas Price Required" }, + "general": { + "message": "General" + }, + "generalSettingsDescription": { + "message": "Currency conversion, primary currency, language, blockies identicon" + }, "generatingTransaction": { "message": "Generating transaction" }, @@ -778,6 +805,9 @@ "ledgerAccountRestriction": { "message": "You need to make use your last account before you can add a new one." }, + "legal": { + "message": "Legal" + }, "lessThanMax": { "message": "must be less than or equal to $1.", "description": "helper for inputting hex as decimal input" @@ -959,6 +989,9 @@ "noTransactions": { "message": "You have no transactions" }, + "notEnoughGas": { + "message": "Not Enough Gas" + }, "notFound": { "message": "Not Found" }, @@ -1228,6 +1261,12 @@ "secretPhrase": { "message": "Enter your secret twelve word phrase here to restore your vault." }, + "securityAndPrivacy": { + "message": "Security & Privacy" + }, + "securitySettingsDescription": { + "message": "Privacy settings and wallet seed phrase" + }, "secondsShorthand": { "message": "Sec" }, @@ -1313,10 +1352,10 @@ "message": "Select this to show gas price and limit controls directly on the send and confirm screens." }, "showFiatConversionInTestnets": { - "message": "Show Conversion in Testnets" + "message": "Show Conversion on Testnets" }, "showFiatConversionInTestnetsDescription": { - "message": "Select this to show fiat conversion in when you are on Testnets" + "message": "Select this to show fiat conversion on Testnets" }, "showPrivateKeys": { "message": "Show Private Keys" diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 04e0c9f0514a..8033b962cb0b 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -686,7 +686,7 @@ "message": "Restaurar desde semilla" }, "restoreVault": { - "message": "Restaurar Bóveda" + "message": "Restaurar bóveda" }, "retryWithMoreGas": { "message": "Vuelva a intentar con un precio de gas más alto aquí" @@ -1168,10 +1168,10 @@ "message": "Nuevo URL de RPC" }, "showAdvancedOptions": { - "message": "Mostrar Opciones Avanzadas" + "message": "Mostrar opciones avanzadas" }, "hideAdvancedOptions": { - "message": "Ocultar Opciones Avanzadas" + "message": "Ocultar opciones avanzadas" }, "optionalChainId": { "message": "ChainID (opcional)" @@ -1183,13 +1183,13 @@ "message": "Apodo (opcional)" }, "newTotal": { - "message": "Nuevo Total" + "message": "Nuevo total" }, "newTransactionFee": { - "message": "Nueva Comisión por Transacción" + "message": "Nueva Comisión por transacción" }, "noConversionRateAvailable": { - "message": "No Hay Tasa de Conversión" + "message": "No hay tasa de conversión" }, "notFound": { "message": "No se encontró" @@ -1238,7 +1238,7 @@ "message": "Prev" }, "primaryCurrencySetting": { - "message": "Moneda Principal" + "message": "Moneda principal" }, "primaryCurrencySettingDescription": { "message": "Seleccionar nativa para prioritizar el que se muestren los valores en la moneda nativa de la cadena (p.ej. ETH). Seleccionar Fíat para prioritzar el que se muestren los valores en la moneda fíat seleccionada." @@ -1247,10 +1247,10 @@ "message": "Cola" }, "rejectAll": { - "message": "Rechazar a Todos" + "message": "Rechazar todas" }, "rejectTxsN": { - "message": "Rechazar a transacciones de $1" + "message": "Rechazar transacciones de $1" }, "rejectTxsDescription": { "message": "Está al punto de rechazar transacciones de $1 en lote." @@ -1271,7 +1271,7 @@ "message": "Restaurar" }, "revealSeedWordsTitle": { - "message": "Frase Semilla" + "message": "Frase semilla" }, "revealSeedWordsDescription": { "message": "Si en algún momento cambias de navegador o de ordenador, necesitarás esta frase semilla para acceder a tus cuentas. Guárdatela en un lugar seguro y secreto." @@ -1298,7 +1298,7 @@ "message": "Lento" }, "slower": { - "message": "Más Lento" + "message": "Más lento" }, "saveAsCsvFile": { "message": "Guardar como archivo CSV" @@ -1316,10 +1316,10 @@ "message": "Seg" }, "selectLocale": { - "message": "Seleccionar Local" + "message": "Seleccionar local" }, "sendAmount": { - "message": "Mandar Cantidad" + "message": "Mandar cantidad" }, "sentEther": { "message": "se mandó ether" @@ -1361,7 +1361,7 @@ "message": "Petición de Firma" }, "somethingWentWrong": { - "message": "¡Ups! Algo se estropeó." + "message": "¡Ups! Algo funcionó mal." }, "speedUp": { "message": "Agilizar" @@ -1382,13 +1382,13 @@ "message": "Cambiar de Red" }, "step1HardwareWallet": { - "message": "1. Conectar Monedero Físico." + "message": "1. Conectar monedero físico." }, "step1HardwareWalletMsg": { "message": "Conéctate el monedero físico directamente al ordenador." }, "step2HardwareWallet": { - "message": "2. Seleccionar una Cuenta" + "message": "2. Seleccionar una cuenta" }, "step2HardwareWalletMsg": { "message": "Seleccione la cuenta que quieres ver. Sólo se puede eligir una a la vez." @@ -1454,10 +1454,10 @@ "message": "Traspasar" }, "transferFrom": { - "message": "Traspasar De" + "message": "Traspasar de" }, "trezorHardwareWallet": { - "message": "Monedero Físico TREZOR" + "message": "Monedero físico TREZOR" }, "tryAgain": { "message": "Vuelve a intentar" diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 4c6541d216ef..b824cd72fa3d 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -30,13 +30,16 @@ "message": "승인 데이터 삭제" }, "reject": { - "message": "받지 않다" + "message": "거부" }, "providerAPIRequest": { "message": "Web3 API 요청" }, "reviewProviderRequest": { - "message": "이 Ethereum API 요청을 검토하십시오." + "message": "이 Ethereum API 요청을 검토하세요." + }, + "providerRequest": { + "message": "$1이 당신의 계정에 연결하길 원합니다." }, "providerRequestInfo": { "message": "아래 나열된 도메인은 Web3 API에 대한 액세스를 요청하여 Ethereum 블록 체인과 상호 작용할 수 있습니다. Ethereum 액세스를 승인하기 전에 항상 올바른 사이트에 있는지 다시 확인하십시오." @@ -44,6 +47,9 @@ "accept": { "message": "수락" }, + "acceleratingATransaction": { + "message": "* 더 높은 가스 요금을 사용하여 트랜잭션을 가속화하면 네트워크에 의해 더 빨리 처리될 가능성이 증가하지만 항상 빠른 처리가 보장되는 것은 아닙니다." + }, "accessingYourCamera": { "message": "카메라에 접근 중..." }, @@ -68,6 +74,9 @@ "address": { "message": "주소" }, + "advancedOptions": { + "message": "고급 옵션" + }, "addCustomToken": { "message": "사용자 정의 토큰 추가" }, @@ -83,12 +92,21 @@ "addAcquiredTokens": { "message": "메타마스크를 통해 획득한 토큰 추가" }, + "advanced": { + "message": "고급" + }, + "allDone": { + "message": "모두 완료" + }, "amount": { "message": "수량" }, "amountPlusGas": { "message": "수량 + 가스" }, + "amountPlusTxFee": { + "message": "Amount + TX Fee" + }, "appDescription": { "message": "이더리움 브라우저 확장 프로그램", "description": "애플리케이션 설명" @@ -109,12 +127,18 @@ "attemptToCancel": { "message": "취소 하시겠습니까?" }, + "attemptToCancelDescription": { + "message": "이 취소 시도가 기존 트랜잭션의 취소를 보장하지 않습니다. 취소 시도가 성공하면 위 거래 수수료가 부과됩니다." + }, "attributions": { "message": "속성" }, "available": { "message": "사용 가능" }, + "average": { + "message": "평균" + }, "back": { "message": "돌아가기" }, @@ -127,6 +151,9 @@ "balanceIsInsufficientGas": { "message": "현재 가스 총합에 대해 잔액이 부족합니다" }, + "basic": { + "message": "Basic" + }, "beta": { "message": "BETA" }, @@ -170,6 +197,9 @@ "cancellationGasFee": { "message": "취소 가스 수수료" }, + "cancelled": { + "message": "취소됨" + }, "cancelN": { "message": "모든 $1 트랜잭션 취소" }, @@ -179,6 +209,12 @@ "clickCopy": { "message": "클릭하여 복사" }, + "clickToAdd": { + "message": "계정에 토큰을 추가하기 위해 $1를 클릭하세요." + }, + "clickToRevealSeed": { + "message": "비밀 단어를 보기 위해 여기를 클릭하세요." + }, "close": { "message": "닫기" }, @@ -188,6 +224,9 @@ "confirm": { "message": "승인" }, + "confirmationTime": { + "message": "처리 시간 (초)" + }, "confirmed": { "message": "승인됨" }, @@ -197,27 +236,39 @@ "confirmPassword": { "message": "비밀번호 확인" }, + "confirmSecretBackupPhrase": { + "message": "비밀 백업 구문 확인" + }, "confirmTransaction": { "message": "트랜잭션 승인" }, + "congratulations": { + "message": "축하합니다." + }, "connectHardwareWallet": { "message": "하드웨어 지갑 연결" }, "connect": { "message": "연결" }, + "connectRequest": { + "message": "연결 요청" + }, "connecting": { "message": "연결 중..." }, + "connectingTo": { + "message": "$1에 연결" + }, + "connectingToKovan": { + "message": "Kovan 테스트넷 접속 중" + }, "connectingToMainnet": { "message": "이더리움 메인넷 접속 중" }, "connectingToRopsten": { "message": "Ropsten 테스트넷 접속 중" }, - "connectingToKovan": { - "message": "Kovan 테스트넷 접속 중" - }, "connectingToRinkeby": { "message": "Rinkeby 테스트넷 접속 중" }, @@ -263,6 +314,12 @@ "copyToClipboard": { "message": "클립보드로 복사" }, + "copyTransactionId": { + "message": "트랜잭션 아이디 복사" + }, + "copiedTransactionId": { + "message": "트랜잭션 아이디 복사됨" + }, "copyButton": { "message": " 복사 " }, @@ -275,9 +332,15 @@ "createAccount": { "message": "계정 생성" }, + "createAWallet": { + "message": "지갑 생성하기" + }, "createDen": { "message": "생성" }, + "createPassword": { + "message": "비밀번호 생성" + }, "crypto": { "message": "암호화폐", "description": "거래 유형 (암호화폐)" @@ -285,6 +348,9 @@ "currentConversion": { "message": "현재 통화" }, + "currencyConversion": { + "message": "통화 변환" + }, "currentLanguage": { "message": "현재 언어" }, @@ -297,6 +363,9 @@ "customGas": { "message": "가스 설정" }, + "customGasSubTitle": { + "message": "수수료를 높히면 처리 시간이 단축될 수 있지만, 그것이 보장되진 않습니다." + }, "customToken": { "message": "사용자 정의 토큰" }, @@ -310,7 +379,7 @@ "message": "소수점은 0 이상이고 36 이하여야 합니다." }, "decimal": { - "message": "소수점 정확도" + "message": "소수 자릿수" }, "defaultNetwork": { "message": "이더리움 트랜잭션의 기본 네트워크는 메인넷입니다." @@ -364,6 +433,9 @@ "downloadGoogleChrome": { "message": "구글 크롬 다운로드" }, + "downloadSecretBackup": { + "message": "이 비밀 백업 구문을 다운로드하여 암호화된 외장 하드 드라이브나 저장 매체에 안전하게 보관하세요." + }, "downloadStateLogs": { "message": "상태 로그 다운로드" }, @@ -388,6 +460,30 @@ "encryptNewDen": { "message": "새로운 DEN을 암호화" }, + "endOfFlowMessage1": { + "message": "인증을 통과했습니다 - 시드 구문을 안전하게 보관하세요. 그것은 당신의 의무입니다." + }, + "endOfFlowMessage2": { + "message": "안전하게 시드 구문을 보관하는 팁" + }, + "endOfFlowMessage3": { + "message": "여러 군데에 시드 구문을 백업하세요." + }, + "endOfFlowMessage4": { + "message": "누구와도 시드 구문을 공유하지마세요." + }, + "endOfFlowMessage5": { + "message": "피싱에 주의하세요! 메타마스크는 절대 갑작스럽게 당신의 시드 구문을 묻지 않습니다." + }, + "endOfFlowMessage6": { + "message": "만약 시드 구문을 다시 백업해야한다면, 설정 -> 보안에서 확인할 수 있습니다. " + }, + "endOfFlowMessage7": { + "message": "만약 질문이 있거나 피싱을 목격했다면 support@metamask.io으로 메일을 보내주세요." + }, + "endOfFlowMessage8": { + "message": "메타마스크는 당신의 시드 구문을 복원해줄 수 없습니다. 더 알아보기." + }, "ensNameNotFound": { "message": "ENS 이름을 찾을 수 없습니다" }, @@ -400,9 +496,15 @@ "enterPasswordContinue": { "message": "계속하기 위해 비밀번호 입력" }, + "eth": { + "message": "ETH" + }, "etherscanView": { "message": "이더스캔에서 계정보기" }, + "estimatedProcessingTimes": { + "message": "예상 처리 시간" + }, "exchangeRate": { "message": "환율" }, @@ -418,6 +520,12 @@ "failed": { "message": "실패" }, + "fast": { + "message": "빠름" + }, + "faster": { + "message": "빨라짐" + }, "fiat": { "message": "FIAT", "description": "거래 형식" @@ -457,18 +565,33 @@ "gasLimitCalculation": { "message": "네트워크 성공률을 기반으로 적합한 가스 한도를 계산합니다." }, + "gasLimitInfoModalContent": { + "message": "가스 한도는 당신이 기꺼이 소비할 수 있는 가스의 최대 수량입니다." + }, "gasLimitRequired": { "message": "가스 한도가 필요합니다." }, "gasLimitTooLow": { "message": "가스 한도는 최소 21000 이상이어야 합니다." }, + "gasUsed": { + "message": "사용된 가스" + }, "generatingSeed": { "message": "시드 생성 중..." }, "gasPrice": { "message": "가스 가격 (GWEI)" }, + "gasPriceExtremelyLow": { + "message": "가스 가격 매우 낮음" + }, + "gasPriceInfoModalContent": { + "message": "가스 가격은 가스 1당 지불할 gwei 단위의 이더 수량을 명시합니다." + }, + "gasPriceNoDenom": { + "message": "가스 가격" + }, "gasPriceCalculation": { "message": "네트워크 성공률을 기반으로 적합한 가스 가격을 계산합니다." }, @@ -488,10 +611,16 @@ "getHelp": { "message": "도움말" }, + "getStarted": { + "message": "시작하기" + }, "greaterThanMin": { "message": "$1 이상이어야 합니다.", "description": "10진수 입력으로 hex값 입력을 도와줍니다" }, + "happyToSeeYou": { + "message": "We’re happy to see you." + }, "hardware": { "message": "하드웨어" }, @@ -545,12 +674,21 @@ "importAccountMsg": { "message": " 가져온 계정은 메타마스크에서 원래 생성된 계정의 시드구문과 연관성이 없습니다. 가져온 계정에 대해 더 배우기 " }, + "importAccountSeedPhrase": { + "message": "시드 구문으로 계정 가져오기" + }, "importAnAccount": { "message": "계정 가져오기" }, "importDen": { "message": "기존의 DEN 가져오기" }, + "importWallet": { + "message": "지갑 가져오기" + }, + "importYourExisting": { + "message": "12개 단어로 구성된 시드 구문으로 이미 만들어진 지갑을 가져오기" + }, "imported": { "message": "가져온 계정", "description": "이 상태는 해당 계정이 keyring으로 완전히 로드된 상태임을 표시합니다" @@ -558,6 +696,9 @@ "importUsingSeed": { "message": "계정 시드 구문으로 가져오기" }, + "importWithSeedPhrase": { + "message": "시드 구문 가져오기" + }, "info": { "message": "정보" }, @@ -567,6 +708,9 @@ "initialTransactionConfirmed": { "message": "초기 트랜잭션이 네트워크를 통해 확정되었습니다. 확인을 누르면 이전으로 돌아갑니다." }, + "insufficientBalance": { + "message": "잔액 부족." + }, "insufficientFunds": { "message": "충분하지 않은 자금." }, @@ -623,6 +767,9 @@ "message": "$1 이하여야합니다.", "description": "10진수 입력으로 hex값 입력을 도와줍니다" }, + "letsGoSetUp": { + "message": "네, 설정해볼게요!" + }, "likeToAddTokens": { "message": "토큰을 추가하시겠습니까?" }, @@ -632,6 +779,9 @@ "limit": { "message": "한도" }, + "liveGasPricePredictions": { + "message": "실시간 가스 가격 예측" + }, "loading": { "message": "로딩 중..." }, @@ -656,6 +806,9 @@ "mainnet": { "message": "이더리움 메인넷" }, + "memorizePhrase": { + "message": "이 구문을 기억하세요." + }, "menu": { "message": "메뉴" }, @@ -663,17 +816,20 @@ "message": "메시지" }, "metamaskDescription": { - "message": "메타마스크는 이더리움을 위한 안전한 신분 저장소입니다." - }, - "metamaskVersion": { - "message": "메타마스크 버전" + "message": "메타마스크는 이더리움을 위한 안전한 저장소입니다." }, "metamaskSeedWords": { "message": "메타마스크 시드 단어" }, + "metamaskVersion": { + "message": "메타마스크 버전" + }, "min": { "message": "최소" }, + "missingYourTokens": { + "message": "당신의 토큰이 보이지 않나요?" + }, "myAccounts": { "message": "내 계정" }, @@ -713,11 +869,44 @@ "newPassword": { "message": "새 비밀번호 (최소 8자 이상)" }, + "newPassword8Chars": { + "message": "새 비밀번호 (최소 8문자)" + }, "newRecipient": { "message": "받는 사람" }, - "newRPC": { - "message": "새로운 RPC URL" + "newNetwork": { + "message": "새 네트워크" + }, + "newToMetaMask": { + "message": "메타마스크를 처음 사용하시나요?" + }, + "noAlreadyHaveSeed": { + "message": "아니요, 이미 시드 구문을 가지고 있습니다." + }, + "rpcURL": { + "message": "새 RPC 주소" + }, + "showAdvancedOptions": { + "message": "고급 옵션 보기" + }, + "hideAdvancedOptions": { + "message": "고급 옵션 숨기기" + }, + "optionalChainId": { + "message": "ChainID (선택)" + }, + "optionalSymbol": { + "message": "Symbol (선택)" + }, + "optionalNickname": { + "message": "Nickname (선택)" + }, + "newTotal": { + "message": "새 합계" + }, + "newTransactionFee": { + "message": "새 트랜잭션 수수료" }, "next": { "message": "다음" @@ -743,12 +932,12 @@ "notStarted": { "message": "시작 안 됨" }, - "noWebcamFound": { - "message": "컴퓨터의 웹캠을 찾을 수 없습니다. 다시 시도해보세요." - }, "noWebcamFoundTitle": { "message": "웹캠이 없습니다" }, + "noWebcamFound": { + "message": "컴퓨터의 웹캠을 찾을 수 없습니다. 다시 시도해보세요." + }, "oldUI": { "message": "구버전 UI" }, @@ -778,6 +967,12 @@ "parameters": { "message": "매개변수" }, + "participateInMetaMetrics": { + "message": "MetaMetrics 참여" + }, + "participateInMetaMetricsDescription": { + "message": "메타마스크를 더 좋게 만들기 위해 MetaMetrics에 참여하세요." + }, "password": { "message": "비밀번호" }, @@ -820,6 +1015,12 @@ "prev": { "message": "이전" }, + "primaryCurrencySetting": { + "message": "주 화폐" + }, + "primaryCurrencySettingDescription": { + "message": "체인의 고유 통화 값으로 우선 표기하시려면 네이티브를 선택하세요. (예: ETH) 설정하신 Fiat 통화 값으로 우선 표기하시려면 Fiat을 선택하세요." + }, "privacyMsg": { "message": "개인정보 보호 정책" }, @@ -887,6 +1088,9 @@ "restoreAccountWithSeed": { "message": "시드 구문으로 계정 복구하기" }, + "requestsAwaitingAcknowledgement": { + "message": "요청이 인정되기까지 대기중" + }, "required": { "message": "필요함" }, @@ -942,11 +1146,11 @@ "save": { "message": "저장" }, - "speedUpTitle": { - "message": "트랜잭션 속도 향상하기" + "slow": { + "message": "느림" }, - "speedUpSubtitle": { - "message": "트랜잭션 가스 가격을 올려서 해당 트랜잭션에 덮어쓰고 속도를 빠르게 합니다" + "slower": { + "message": "느려짐" }, "saveAsCsvFile": { "message": "CSV 파일로 저장" @@ -970,11 +1174,23 @@ "searchResults": { "message": "검색 결과" }, + "secretBackupPhrase": { + "message": "비밀 백업 구문" + }, + "secretBackupPhraseDescription": { + "message": "비밀 백업 구문을 사용하면 계정을 쉽게 백업하고 복원할 수 있습니다." + }, + "secretBackupPhraseWarning": { + "message": "경고: 백업 구문을 절대 공개하지 마세요. 이 구문을 가진 누군가 당신의 이더를 영원히 가지고 갈 수 있습니다." + }, "secretPhrase": { "message": "12개 단어로 구성된 비밀 구문을 입력하여 저장소를 복구하세요." }, - "newPassword8Chars": { - "message": "새 비밀번호 (최소 8문자)" + "secondsShorthand": { + "message": "초" + }, + "seedPhrasePlaceholder": { + "message": "각 단어를 스페이스로 구분해주세요" }, "seedPhraseReq": { "message": "시드 구문은 12개의 단어입니다" @@ -985,6 +1201,9 @@ "selectCurrency": { "message": "통화 선택" }, + "selectEachPhrase": { + "message": "백업 구문이 올바른지 확인하기 위해 각 단어를 순서에 맞게 선택해주세요." + }, "selectLocale": { "message": "언어 선택" }, @@ -997,6 +1216,9 @@ "send": { "message": "전송" }, + "sendAmount": { + "message": "전송 수량" + }, "sendETH": { "message": "ETH 보내기" }, @@ -1024,6 +1246,9 @@ "selectAnAccountHelp": { "message": "메타마스크에서 보기 위한 계정 선택" }, + "selectAHigherGasFee": { + "message": "트랜잭션 처리를 가속하기 위해 더 높은 가스 요금을 선택하세요.*" + }, "selectHdPath": { "message": "HD 경로 지정" }, @@ -1039,6 +1264,18 @@ "shapeshiftBuy": { "message": "Shapeshift를 통해서 구매하기" }, + "showAdvancedGasInline": { + "message": "고급 가스 제어" + }, + "showAdvancedGasInlineDescription": { + "message": "전송 및 확인 화면에서 직접 가스 가격과 한도 제어를 표시하려면 이 옵션을 선택해주세요." + }, + "showFiatConversionInTestnets": { + "message": "테스트 넷에서 fiat 변환 보여주기" + }, + "showFiatConversionInTestnetsDescription": { + "message": "테스트 넷에서 fiat 변환을 보기 위해 활성화하세요" + }, "showPrivateKeys": { "message": "개인키 보기" }, @@ -1054,12 +1291,12 @@ "sign": { "message": "서명" }, - "signed": { - "message": "서명됨" - }, "signatureRequest": { "message": "서명 요청" }, + "signed": { + "message": "서명됨" + }, "signMessage": { "message": "메시지 서명" }, @@ -1072,9 +1309,30 @@ "sigRequested": { "message": "서명이 요청됨" }, + "somethingWentWrong": { + "message": "헉! 뭔가 잘못됐어요." + }, "spaceBetween": { "message": "단어 사이에는 공백만 올 수 있습니다" }, + "speedUp": { + "message": "속도 향상" + }, + "speedUpTitle": { + "message": "트랜잭션 속도 향상하기" + }, + "speedUpSubtitle": { + "message": "트랜잭션 가스 가격을 올려서 해당 트랜잭션에 덮어쓰고 속도를 빠르게 합니다" + }, + "speedUpCancellation": { + "message": "취소 속도 향상" + }, + "speedUpTransaction": { + "message": "트랜잭션 속도 향상" + }, + "switchNetworks": { + "message": "네트워크 변경" + }, "status": { "message": "상태" }, @@ -1105,6 +1363,9 @@ "step3HardwareWalletMsg": { "message": "다른 이더리움 계정을 사용하듯 하드웨어 계정을 사용합니다. dApps을 로그인하거나, 이더를 보내거나, ERC20 토큰 혹은 대체 가능하지 않은 토큰 (예를 들어 CryptoKitties)을 사거나 저장하거나 합니다." }, + "storePhrase": { + "message": "이 구문을 1Password같은 암호 관리자에 저장하세요." + }, "submit": { "message": "제출" }, @@ -1126,8 +1387,14 @@ "testFaucet": { "message": "파우셋 테스트" }, + "thisWillCreate": { + "message": "새로운 지갑과 시드 구문을 생성" + }, + "tips": { + "message": "팁" + }, "to": { - "message": "받는이: " + "message": "받는이" }, "toETHviaShapeShift": { "message": "ShapeShift를 통해 $1를 ETH로 바꾸기", @@ -1145,6 +1412,9 @@ "tokenBalance": { "message": "현재 토큰 잔액:" }, + "tokenContractAddress": { + "message": "토큰 컨트랙트 주소" + }, "tokenSelection": { "message": "토큰을 검색하거나 유명한 토큰 리스트에서 선택하시기 바랍니다." }, @@ -1160,21 +1430,63 @@ "transaction": { "message": "트랜잭션" }, + "transactionConfirmed": { + "message": "트랜잭션이 승인됨 $2." + }, + "transactionCreated": { + "message": "$1에 대한 트랜잭션이 생성됨 $2." + }, + "transactionWithNonce": { + "message": "트랜잭션 $1" + }, + "transactionDropped": { + "message": "트랜잭션이 드롭됨 $2." + }, + "transactionSubmitted": { + "message": "$1의 가스 요금으로 트랜잭션이 제출됨 $2." + }, + "transactionResubmitted": { + "message": "$1으로 가스 요금을 올려 트랜잭션이 다시 제출됨 $2." + }, + "transactionUpdated": { + "message": "트랜잭션이 수정됨 $2." + }, + "transactionUpdatedGas": { + "message": "$1의 가스 요금으로 트랜잭션이 수정됨 $2." + }, + "transactionErrored": { + "message": "트랜잭션 오류 발생." + }, + "transactionCancelAttempted": { + "message": "$1의 가스 요금으로 트랜잭션 취소가 시도됨 $2." + }, + "transactionCancelSuccess": { + "message": "트랜잭션이 성공적으로 취소됨 $2." + }, "transactions": { "message": "트랜잭션" }, "transactionError": { "message": "트랜잭션 오류. 컨트랙트 코드에서 예외 발생(Exception thrown)." }, + "transactionFee": { + "message": "수수료" + }, "transactionMemo": { "message": "트랜잭션 메모 (선택사항)" }, "transactionNumber": { "message": "트랜잭션 번호" }, + "transactionTime": { + "message": "트랜잭션 시간" + }, "transfer": { "message": "전송" }, + "transferFrom": { + "message": "보내는 이" + }, "transfers": { "message": "전송" }, @@ -1194,6 +1506,9 @@ "typePassword": { "message": "비밀번호를 입력하세요" }, + "uiMigrationAnnouncement": { + "message": "새로운 메타마스크 UI에 오신 것을 환영합니다. UI에 대한 피드백 또는 기능 요청이 있는 경우, 당사의 지원팀 또는 GitHub에 연락해주세요." + }, "uiWelcome": { "message": "새로운 UI에 오신 것을 환영합니다. (Beta)" }, @@ -1234,7 +1549,10 @@ "message": "잠금 해제" }, "unlockMessage": { - "message": "우리가 기다리던 분권형 웹입니다" + "message": "우리가 기다리던 탈 중앙화 웹입니다" + }, + "updatedWithDate": { + "message": "$1에 업데이트 됨" }, "uriErrorMsg": { "message": "URI는 HTTP/HTTPS로 시작해야 합니다." @@ -1279,9 +1597,15 @@ "whatsThis": { "message": "이것은 무엇인가요?" }, + "writePhrase": { + "message": "이 구문을 종이에 써서 안전한 장소에 보관하세요. 만약 당신이 더 높은 수준의 보안을 원한다면, 그것을 여러 장의 종이에 적어서 각각 2-3개의 다른 위치에 보관하세요." + }, "yesLetsTry": { "message": "네, 시도해보겠습니다." }, + "youNeedToAllowCameraAccess": { + "message": "이 기능을 사용하려면 카메라 접근을 허용해야 합니다." + }, "yourSigRequested": { "message": "서명을 요청 중입니다." }, @@ -1290,8 +1614,5 @@ }, "yourPrivateSeedPhrase": { "message": "개인 시드 구문" - }, - "youNeedToAllowCameraAccess": { - "message": "이 기능을 사용하려면 카메라 접근을 허용해야 합니다." } } diff --git a/app/images/caret-left-black.svg b/app/images/caret-left-black.svg new file mode 100644 index 000000000000..872135ece42d --- /dev/null +++ b/app/images/caret-left-black.svg @@ -0,0 +1,18 @@ + + + + 8439120D-5704-4273-B416-FEE134322584 + Created with sketchtool. + + + + + + + + + + + + + diff --git a/app/images/wyre.svg b/app/images/wyre.svg new file mode 100644 index 000000000000..a5209329d552 --- /dev/null +++ b/app/images/wyre.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/manifest.json b/app/manifest.json index 6dbd8ad09376..6837adf619c2 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_appName__", "short_name": "__MSG_appName__", - "version": "6.2.0", + "version": "6.3.0", "manifest_version": 2, "author": "https://metamask.io", "description": "__MSG_appDescription__", diff --git a/app/scripts/background.js b/app/scripts/background.js index 189858a1d3b3..7fea3c8c67b9 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -102,7 +102,6 @@ setupMetamaskMeshMetrics() * @property {boolean} isInitialized - Whether the first vault has been created. * @property {boolean} isUnlocked - Whether the vault is currently decrypted and accounts are available for selection. * @property {boolean} isAccountMenuOpen - Represents whether the main account selection UI is currently displayed. - * @property {boolean} isMascara - True if the current context is the extensionless MetaMascara project. * @property {boolean} isPopup - Returns true if the current view is an externally-triggered notification. * @property {string} rpcTarget - DEPRECATED - The URL of the current RPC provider. * @property {Object} identities - An object matching lower-case hex addresses to Identity objects with "address" and "name" (nickname) keys. @@ -448,7 +447,7 @@ function setupController (initState, initLangCode) { function triggerUi () { extension.tabs.query({ active: true }, tabs => { const currentlyActiveMetamaskTab = Boolean(tabs.find(tab => openMetamaskTabsIDs[tab.id])) - if (!popupIsOpen && !currentlyActiveMetamaskTab) { + if (!popupIsOpen && !currentlyActiveMetamaskTab && !notificationIsOpen) { notificationManager.showPopup() notificationIsOpen = true } diff --git a/app/scripts/controllers/address-book.js b/app/scripts/controllers/address-book.js deleted file mode 100644 index 4697e074c9bd..000000000000 --- a/app/scripts/controllers/address-book.js +++ /dev/null @@ -1,98 +0,0 @@ -const ObservableStore = require('obs-store') -const extend = require('xtend') - -class AddressBookController { - - - /** - * Controller in charge of managing the address book functionality from the - * recipients field on the send screen. Manages a history of all saved - * addresses and all currently owned addresses. - * - * @typedef {Object} AddressBookController - * @param {object} opts Overrides the defaults for the initial state of this.store - * @property {array} opts.initState initializes the the state of the AddressBookController. Can contain an - * addressBook property to initialize the addressBook array - * @property {object} opts.preferencesStore the {@code PreferencesController} store - * @property {object} store The the store of the current users address book - * @property {array} store.addressBook An array of addresses and nicknames. These are set by the user when sending - * to a new address. - * - */ - constructor ({initState, preferencesStore}) { - this.store = new ObservableStore(extend({ - addressBook: [], - }, initState)) - this._preferencesStore = preferencesStore - } - - // - // PUBLIC METHODS - // - - /** - * Sets a new address book in store by accepting a new address and nickname. - * - * @param {string} address A hex address of a new account that the user is sending to. - * @param {string} name The name the user wishes to associate with the new account - * @returns {Promise} Promise resolves with undefined - * - */ - setAddressBook (address, name) { - return this._addToAddressBook(address, name) - .then((addressBook) => { - this.store.updateState({ - addressBook, - }) - return Promise.resolve() - }) - } - - /** - * Performs the logic to add the address and name into the address book. The pushed object is an object of two - * fields. Current behavior does not set an upper limit to the number of addresses. - * - * @private - * @param {string} address A hex address of a new account that the user is sending to. - * @param {string} name The name the user wishes to associate with the new account - * @returns {Promise} Promises the updated addressBook array - * - */ - _addToAddressBook (address, name) { - const addressBook = this._getAddressBook() - const {identities} = this._preferencesStore.getState() - - const addressBookIndex = addressBook.findIndex((element) => { return element.address.toLowerCase() === address.toLowerCase() || element.name === name }) - const identitiesIndex = Object.keys(identities).findIndex((element) => { return element.toLowerCase() === address.toLowerCase() }) - // trigger this condition if we own this address--no need to overwrite. - if (identitiesIndex !== -1) { - return Promise.resolve(addressBook) - // trigger this condition if we've seen this address before--may need to update nickname. - } else if (addressBookIndex !== -1) { - addressBook.splice(addressBookIndex, 1) - } else if (addressBook.length > 15) { - addressBook.shift() - } - - - addressBook.push({ - address: address, - name, - }) - return Promise.resolve(addressBook) - } - - /** - * Internal method to get the address book. Current persistence behavior should not require that this method be - * called from the UI directly. - * - * @private - * @returns {array} The addressBook array from the store. - * - */ - _getAddressBook () { - return this.store.getState().addressBook - } -} - -module.exports = AddressBookController diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index f923413537dd..7374118904c9 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -40,7 +40,9 @@ class PreferencesController { // Feature flag toggling is available in the global namespace // for convenient testing of pre-release features, and should never // perform sensitive operations. - featureFlags: {}, + featureFlags: { + privacyMode: true, + }, knownMethodData: {}, participateInMetaMetrics: null, firstTimeFlowType: null, diff --git a/app/scripts/controllers/transactions/tx-gas-utils.js b/app/scripts/controllers/transactions/tx-gas-utils.js index b296dc5eb5d5..76555116720f 100644 --- a/app/scripts/controllers/transactions/tx-gas-utils.js +++ b/app/scripts/controllers/transactions/tx-gas-utils.js @@ -7,7 +7,7 @@ const { const { addHexPrefix } = require('ethereumjs-util') const SIMPLE_GAS_COST = '0x5208' // Hex for 21000, cost of a simple send. -import { TRANSACTION_NO_CONTRACT_ERROR_KEY } from '../../../../ui/app/constants/error-keys' +import { TRANSACTION_NO_CONTRACT_ERROR_KEY } from '../../../../ui/app/helpers/constants/error-keys' /** tx-gas-utils are gas utility methods for Transaction manager diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js index c7f0c56696dd..68394d1ae743 100644 --- a/app/scripts/inpage.js +++ b/app/scripts/inpage.js @@ -91,6 +91,10 @@ inpageProvider.enable = function ({ force } = {}) { }) } +// give the dapps control of a refresh they can toggle this off on the window.ethereum +// this will be default true so it does not break any old apps. +inpageProvider.autoRefreshOnNetworkChange = true + // add metamask-specific convenience methods inpageProvider._metamask = new Proxy({ /** diff --git a/app/scripts/lib/ComposableObservableStore.js b/app/scripts/lib/ComposableObservableStore.js index d5ee708a1814..abb77967291b 100644 --- a/app/scripts/lib/ComposableObservableStore.js +++ b/app/scripts/lib/ComposableObservableStore.js @@ -40,7 +40,9 @@ class ComposableObservableStore extends ObservableStore { getFlatState () { let flatState = {} for (const key in this.config) { - flatState = { ...flatState, ...this.config[key].getState() } + const controller = this.config[key] + const state = controller.getState ? controller.getState() : controller.state + flatState = { ...flatState, ...state } } return flatState } diff --git a/app/scripts/lib/auto-reload.js b/app/scripts/lib/auto-reload.js index 558391a06448..44fbe847c6a6 100644 --- a/app/scripts/lib/auto-reload.js +++ b/app/scripts/lib/auto-reload.js @@ -20,6 +20,10 @@ function setupDappAutoReload (web3, observable) { }) observable.subscribe(function (state) { + // if the auto refresh on network change is false do not + // do anything + if (!window.ethereum.autoRefreshOnNetworkChange) return + // if reload in progress, no need to check reload logic if (reloadInProgress) return diff --git a/app/scripts/lib/buy-eth-url.js b/app/scripts/lib/buy-eth-url.js index 4e2d0bc79429..040b5695bcb6 100644 --- a/app/scripts/lib/buy-eth-url.js +++ b/app/scripts/lib/buy-eth-url.js @@ -15,7 +15,7 @@ function getBuyEthUrl ({ network, amount, address }) { let url switch (network) { case '1': - url = `https://buy.coinbase.com/?code=9ec56d01-7e81-5017-930c-513daa27bb6a&amount=${amount}&address=${address}&crypto_currency=ETH` + url = `https://dash.sendwyre.com/sign-up` break case '3': diff --git a/app/scripts/lib/notification-manager.js b/app/scripts/lib/notification-manager.js index 969a9459a135..721d109a1a95 100644 --- a/app/scripts/lib/notification-manager.js +++ b/app/scripts/lib/notification-manager.js @@ -1,7 +1,6 @@ const extension = require('extensionizer') -const height = 620 -const width = 360 - +const NOTIFICATION_HEIGHT = 620 +const NOTIFICATION_WIDTH = 360 class NotificationManager { @@ -26,13 +25,18 @@ class NotificationManager { // bring focus to existing chrome popup extension.windows.update(popup.id, { focused: true }) } else { + const {screenX, screenY, outerWidth, outerHeight} = window + const notificationTop = Math.round(screenY + (outerHeight / 2) - (NOTIFICATION_HEIGHT / 2)) + const notificationLeft = Math.round(screenX + (outerWidth / 2) - (NOTIFICATION_WIDTH / 2)) const cb = (currentPopup) => { this._popupId = currentPopup.id } // create new notification popup const creation = extension.windows.create({ url: 'notification.html', type: 'popup', - width, - height, + width: NOTIFICATION_WIDTH, + height: NOTIFICATION_HEIGHT, + top: Math.max(notificationTop, 0), + left: Math.max(notificationLeft, 0), }, cb) creation && creation.then && creation.then(cb) } diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 653868066374..540aee936eb1 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -26,7 +26,6 @@ const PreferencesController = require('./controllers/preferences') const CurrencyController = require('./controllers/currency') const NoticeController = require('./notice-controller') const ShapeShiftController = require('./controllers/shapeshift') -const AddressBookController = require('./controllers/address-book') const InfuraController = require('./controllers/infura') const BlacklistController = require('./controllers/blacklist') const CachedBalancesController = require('./controllers/cached-balances') @@ -55,6 +54,7 @@ const HW_WALLETS_KEYRINGS = [TrezorKeyring.type, LedgerBridgeKeyring.type] const EthQuery = require('eth-query') const ethUtil = require('ethereumjs-util') const sigUtil = require('eth-sig-util') +const { AddressBookController } = require('gaba') module.exports = class MetamaskController extends EventEmitter { @@ -175,11 +175,7 @@ module.exports = class MetamaskController extends EventEmitter { keyringMemStore: this.keyringController.memStore, }) - // address book controller - this.addressBookController = new AddressBookController({ - initState: initState.AddressBookController, - preferencesStore: this.preferencesController.store, - }) + this.addressBookController = new AddressBookController(undefined, initState.AddressBookController) // tx mgmt this.txController = new TransactionController({ @@ -245,7 +241,7 @@ module.exports = class MetamaskController extends EventEmitter { TransactionController: this.txController.store, KeyringController: this.keyringController.store, PreferencesController: this.preferencesController.store, - AddressBookController: this.addressBookController.store, + AddressBookController: this.addressBookController, CurrencyController: this.currencyController.store, NoticeController: this.noticeController.store, ShapeShiftController: this.shapeshiftController.store, @@ -267,7 +263,7 @@ module.exports = class MetamaskController extends EventEmitter { KeyringController: this.keyringController.memStore, PreferencesController: this.preferencesController.store, RecentBlocksController: this.recentBlocksController.store, - AddressBookController: this.addressBookController.store, + AddressBookController: this.addressBookController, CurrencyController: this.currencyController.store, NoticeController: this.noticeController.memStore, ShapeshiftController: this.shapeshiftController.store, @@ -376,7 +372,6 @@ module.exports = class MetamaskController extends EventEmitter { const preferencesController = this.preferencesController const txController = this.txController const noticeController = this.noticeController - const addressBookController = this.addressBookController const networkController = this.networkController const providerApprovalController = this.providerApprovalController @@ -443,7 +438,7 @@ module.exports = class MetamaskController extends EventEmitter { whitelistPhishingDomain: this.whitelistPhishingDomain.bind(this), // AddressController - setAddressBook: nodeify(addressBookController.setAddressBook, addressBookController), + setAddressBook: this.addressBookController.set.bind(this.addressBookController), // KeyringController setLocked: nodeify(this.setLocked, this), diff --git a/auto-changelog.sh b/development/auto-changelog.sh similarity index 100% rename from auto-changelog.sh rename to development/auto-changelog.sh diff --git a/development/metamaskbot-build-announce.js b/development/metamaskbot-build-announce.js index 96b5572fed42..07adbcb5d833 100755 --- a/development/metamaskbot-build-announce.js +++ b/development/metamaskbot-build-announce.js @@ -23,7 +23,6 @@ async function start () { const SHORT_SHA1 = CIRCLE_SHA1.slice(0, 7) const BUILD_LINK_BASE = `https://${CIRCLE_BUILD_NUM}-42009758-gh.circle-artifacts.com/0` - const MASCARA = `${BUILD_LINK_BASE}/builds/mascara/home.html` const CHROME = `${BUILD_LINK_BASE}/builds/metamask-chrome-${VERSION}.zip` const FIREFOX = `${BUILD_LINK_BASE}/builds/metamask-firefox-${VERSION}.zip` const EDGE = `${BUILD_LINK_BASE}/builds/metamask-edge-${VERSION}.zip` @@ -34,7 +33,6 @@ async function start () {
Builds ready [${SHORT_SHA1}]: - mascara, chrome, firefox, edge, diff --git a/development/mock-dev.js b/development/mock-dev.js index 1af10a13178d..4a3217a06b38 100644 --- a/development/mock-dev.js +++ b/development/mock-dev.js @@ -14,9 +14,9 @@ const render = require('react-dom').render const h = require('react-hyperscript') -const Root = require('../ui/app/root') -const configureStore = require('../ui/app/store') -const actions = require('../ui/app/actions') +const Root = require('../ui/app/pages') +const configureStore = require('../ui/app/store/store') +const actions = require('../ui/app/store/actions') const states = require('./states') const backGroundConnectionModifiers = require('./backGroundConnectionModifiers') const Selector = require('./selector') diff --git a/development/rollback.sh b/development/rollback.sh new file mode 100755 index 000000000000..0a1d8ad62022 --- /dev/null +++ b/development/rollback.sh @@ -0,0 +1,35 @@ +#! /bin/bash + +[[ -z "$1" ]] && { echo "Rollback version is required!" ; exit 1; } +echo "Rolling back to version $1" + +# Checkout branch to increment version +git checkout -b version-increment-$1 +npm run version:bump patch + +# Store the new version name +NEW_VERSION=$(cat app/manifest.json | jq -r .version) + +# Make sure origin tags are loaded +git fetch origin + +# check out the rollback branch +git checkout origin/v$1 + +# Create the rollback branch. +git checkout -b Version-$NEW_VERSION-Rollback-to-$1 + +# Set the version files to the next one. +git checkout master CHANGELOG.md +git checkout master app/manifest.json +git commit -m "Version $NEW_VERSION (Rollback to $1)" + +# Push the new branch to PR +git push -u origin HEAD + +# Create tag and push that up too +git tag v${NEW_VERSION} +git push origin v${NEW_VERSION} + +# Cleanup version branch +git branch -D version-increment-$1 diff --git a/development/sourcemap-validator.js b/development/sourcemap-validator.js index 14388812870b..546745f1665d 100644 --- a/development/sourcemap-validator.js +++ b/development/sourcemap-validator.js @@ -1,6 +1,9 @@ const fs = require('fs') const { SourceMapConsumer } = require('source-map') const path = require('path') +const pify = require('pify') +const fsAsync = pify(fs) + // // Utility to help check if sourcemaps are working // @@ -9,39 +12,85 @@ const path = require('path') // if not working it may error or print minified garbage // -start() +start().catch(console.error) async function start () { - const rawBuild = fs.readFileSync(path.join(__dirname, '/../dist/chrome/', 'inpage.js') - , 'utf8') - const rawSourceMap = fs.readFileSync(path.join(__dirname, '/../dist/sourcemaps/', 'inpage.js.map'), 'utf8') + const targetFiles = [`inpage.js`, `contentscript.js`, `ui.js`, `background.js`] + for (const buildName of targetFiles) { + await validateSourcemapForFile({ buildName }) + } +} + +async function validateSourcemapForFile ({ buildName }) { + console.log(`build "${buildName}"`) + const platform = `chrome` + // load build and sourcemaps + let rawBuild + try { + const filePath = path.join(__dirname, `/../dist/${platform}/`, `${buildName}`) + rawBuild = await fsAsync.readFile(filePath, 'utf8') + } catch (err) {} + if (!rawBuild) { + throw new Error(`SourcemapValidator - failed to load source file for "${buildName}"`) + } + // attempt to load in dist mode + let rawSourceMap + try { + const filePath = path.join(__dirname, `/../dist/sourcemaps/`, `${buildName}.map`) + rawSourceMap = await fsAsync.readFile(filePath, 'utf8') + } catch (err) {} + // attempt to load in dev mode + try { + const filePath = path.join(__dirname, `/../dist/${platform}/`, `${buildName}.map`) + rawSourceMap = await fsAsync.readFile(filePath, 'utf8') + } catch (err) {} + if (!rawSourceMap) { + throw new Error(`SourcemapValidator - failed to load sourcemaps for "${buildName}"`) + } + const consumer = await new SourceMapConsumer(rawSourceMap) - console.log('hasContentsOfAllSources:', consumer.hasContentsOfAllSources(), '\n') - console.log('sources:') - consumer.sources.map((sourcePath) => console.log(sourcePath)) - - console.log('\nexamining "new Error" statements:\n') - const sourceLines = rawBuild.split('\n') - sourceLines.map(line => indicesOf('new Error', line)) - .forEach((errorIndices, lineIndex) => { - // if (errorIndex === null) return console.log('line does not contain "new Error"') - errorIndices.forEach((errorIndex) => { - const position = { line: lineIndex + 1, column: errorIndex } + const hasContentsOfAllSources = consumer.hasContentsOfAllSources() + if (!hasContentsOfAllSources) console.warn('SourcemapValidator - missing content of some sources...') + + console.log(` sampling from ${consumer.sources.length} files`) + let sampleCount = 0 + + const buildLines = rawBuild.split('\n') + const targetString = 'new Error' + // const targetString = 'null' + const matchesPerLine = buildLines.map(line => indicesOf(targetString, line)) + matchesPerLine.forEach((matchIndices, lineIndex) => { + matchIndices.forEach((matchColumn) => { + sampleCount++ + const position = { line: lineIndex + 1, column: matchColumn } const result = consumer.originalPositionFor(position) - if (!result.source) return console.warn(`!! missing source for position: ${position}`) - // filter out deps distributed minified without sourcemaps - if (result.source === 'node_modules/browserify/node_modules/browser-pack/_prelude.js') return // minified mess - if (result.source === 'node_modules/web3/dist/web3.min.js') return // minified mess + // warn if source content is missing + if (!result.source) { + console.warn(`!! missing source for position: ${JSON.stringify(position)}`) + // const buildLine = buildLines[position.line - 1] + console.warn(` origin in build:`) + console.warn(` ${buildLines[position.line - 2]}`) + console.warn(`-> ${buildLines[position.line - 1]}`) + console.warn(` ${buildLines[position.line - 0]}`) + return + } const sourceContent = consumer.sourceContentFor(result.source) const sourceLines = sourceContent.split('\n') const line = sourceLines[result.line - 1] - console.log(`\n========================== ${result.source} ====================================\n`) - console.log(line) - console.log(`\n==============================================================================\n`) + // this sometimes includes the whole line though we tried to match somewhere in the middle + const portion = line.slice(result.column) + const isMaybeValid = portion.includes(targetString) + if (!isMaybeValid) { + console.error('Sourcemap seems invalid:') + console.log(`\n========================== ${result.source} ====================================\n`) + console.log(line) + console.log(`\n==============================================================================\n`) + } }) }) + console.log(` checked ${sampleCount} samples`) } function indicesOf (substring, string) { diff --git a/development/states/navigate-txs.json b/development/states/navigate-txs.json index 813b02172379..23255abed60b 100644 --- a/development/states/navigate-txs.json +++ b/development/states/navigate-txs.json @@ -3,7 +3,6 @@ "isInitialized": true, "isUnlocked": true, "isAccountMenuOpen": false, - "isMascara": false, "isPopup": false, "rpcTarget": "https://rawtestrpc.metamask.io/", "identities": { diff --git a/development/states/pending-tx.json b/development/states/pending-tx.json index bfa93f7ae3c9..b4a6565fa414 100644 --- a/development/states/pending-tx.json +++ b/development/states/pending-tx.json @@ -2,7 +2,6 @@ "metamask": { "isInitialized": true, "isUnlocked": true, - "isMascara": false, "rpcTarget": "https://rawtestrpc.metamask.io/", "identities": { "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { diff --git a/development/ui-dev.js b/development/ui-dev.js index bae0ce50eb53..70f513972c38 100644 --- a/development/ui-dev.js +++ b/development/ui-dev.js @@ -17,7 +17,7 @@ const render = require('react-dom').render const h = require('react-hyperscript') -const Root = require('../ui/app/root') +const Root = require('../ui/app/pages') const configureStore = require('./uiStore') const states = require('./states') const Selector = require('./selector') diff --git a/development/uiStore.js b/development/uiStore.js index c71d66d3b670..bfec8f5e472e 100644 --- a/development/uiStore.js +++ b/development/uiStore.js @@ -2,7 +2,7 @@ const createStore = require('redux').createStore const applyMiddleware = require('redux').applyMiddleware const thunkMiddleware = require('redux-thunk').default const createLogger = require('redux-logger').createLogger -const rootReducer = require('../ui/app/reducers') +const rootReducer = require('../ui/app/ducks') module.exports = configureStore diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 9a57617dd84a..000000000000 --- a/docker-compose.yml +++ /dev/null @@ -1,11 +0,0 @@ -metamascara: - build: ./ - restart: always - ports: - - "9001" - environment: - MASCARA_ORIGIN: "https://wallet.metamask.io" - VIRTUAL_PORT: "9001" - VIRTUAL_HOST: "wallet.metamask.io" - LETSENCRYPT_HOST: "wallet.metamask.io" - LETSENCRYPT_EMAIL: "admin@metamask.io" \ No newline at end of file diff --git a/docs/adding-new-networks.md b/docs/adding-new-networks.md index b74233fa6863..40925f135054 100644 --- a/docs/adding-new-networks.md +++ b/docs/adding-new-networks.md @@ -5,7 +5,7 @@ To add another network to our dropdown menu, make sure the following files are a ``` app/scripts/config.js app/scripts/lib/buy-eth-url.js -ui/app/app.js +ui/app/index.js ui/app/components/buy-button-subview.js ui/app/components/drop-menu-item.js ui/app/components/network.js diff --git a/docs/secret-preferences.md b/docs/secret-preferences.md index f9d01a5038c2..58a4554c41ed 100644 --- a/docs/secret-preferences.md +++ b/docs/secret-preferences.md @@ -6,5 +6,5 @@ One example is our "sync with mobile" feature, which didn't make sense to roll o To enable features like this, first open the background console, and then you can use the global method `global.setPreference(key, value)`. -For example, if the feature flag was a booelan was called `mobileSync`, you might type `setPreference('mobileSync', true)`. +For example, if the feature flag was a boolean was called `useNativeCurrencyAsPrimaryCurrency`, you might type `setPreference('useNativeCurrencyAsPrimaryCurrency', true)`. diff --git a/docs/sensitive-release.md b/docs/sensitive-release.md index e2c4e2f3d611..288df57eb9a3 100644 --- a/docs/sensitive-release.md +++ b/docs/sensitive-release.md @@ -18,10 +18,10 @@ Simply follow the steps in [the publishing guide](./publishing.md). ### Prepare Rollback Release -1. Check out the tagged commit for the release before this new release. -2. Increment the version over the new release by one patch. -3. Merge the changelog of the new release into this branch, and make its own changelog refer to rolling back those changes. -4. Push to the main repository and pull request against `master` prominently noting this is a `DO NOT MERGE` rollback pull request. +1. Be on the new risky version branch. +2. Run `npm run rollback $ROLLBACK_TARGET_VERSION`. + +The rollback version will now be a branch and tag on the origin. ### Roll the normal release out diff --git a/gulpfile.js b/gulpfile.js index c672a9eff581..c1012d5aa61b 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -51,8 +51,6 @@ const browserPlatforms = [ 'opera', ] const commonPlatforms = [ - // browser webapp - 'mascara', // browser extensions ...browserPlatforms, ] @@ -110,14 +108,6 @@ createCopyTasks('manifest', { destinations: browserPlatforms.map(platform => `./dist/${platform}`), }) -// copy mascara - -createCopyTasks('html:mascara', { - source: './mascara/', - pattern: 'proxy/index.html', - destinations: [`./dist/mascara/`], -}) - function createCopyTasks (label, opts) { if (!opts.devOnly) { const copyTaskName = `copy:${label}` @@ -298,8 +288,6 @@ const buildJsFiles = [ createTasksForBuildJsUIDeps({ dependenciesToBundle: uiDependenciesToBundle, filename: 'libs' }) createTasksForBuildJsExtension({ buildJsFiles, taskPrefix: 'dev:extension:js', devMode: true }) createTasksForBuildJsExtension({ buildJsFiles, taskPrefix: 'build:extension:js' }) -createTasksForBuildJsMascara({ taskPrefix: 'build:mascara:js' }) -createTasksForBuildJsMascara({ taskPrefix: 'dev:mascara:js', devMode: true }) function createTasksForBuildJsUIDeps ({ dependenciesToBundle, filename }) { const destinations = browserPlatforms.map(platform => `./dist/${platform}`) @@ -340,22 +328,6 @@ function createTasksForBuildJsExtension ({ buildJsFiles, taskPrefix, devMode, bu createTasksForBuildJs({ rootDir, taskPrefix, bundleTaskOpts, destinations, buildPhase1, buildPhase2 }) } -function createTasksForBuildJsMascara ({ taskPrefix, devMode, bundleTaskOpts = {} }) { - // inpage must be built before all other scripts: - const rootDir = './mascara/src/' - const buildPhase1 = ['ui', 'proxy', 'background', 'metamascara'] - const destinations = ['./dist/mascara'] - bundleTaskOpts = Object.assign({ - buildSourceMaps: true, - sourceMapDir: './', - minifyBuild: !devMode, - buildWithFullPaths: devMode, - watch: devMode, - devMode, - }, bundleTaskOpts) - createTasksForBuildJs({ rootDir, taskPrefix, bundleTaskOpts, destinations, buildPhase1 }) -} - function createTasksForBuildJs ({ rootDir, taskPrefix, bundleTaskOpts, destinations, buildPhase1 = [], buildPhase2 = [] }) { // bundle task for each file const jsFiles = [].concat(buildPhase1, buildPhase2) @@ -405,7 +377,6 @@ gulp.task('dev', 'dev:scss', gulp.parallel( 'dev:extension:js', - 'dev:mascara:js', 'dev:copy', 'dev:reload' ) @@ -424,18 +395,6 @@ gulp.task('dev:extension', ) ) -gulp.task('dev:mascara', - gulp.series( - 'clean', - 'dev:scss', - gulp.parallel( - 'dev:mascara:js', - 'dev:copy', - 'dev:reload' - ) - ) -) - gulp.task('build', gulp.series( 'clean', @@ -443,7 +402,6 @@ gulp.task('build', gulpParallel( 'build:extension:js:uideps', 'build:extension:js', - 'build:mascara:js', 'copy' ) ) @@ -460,17 +418,6 @@ gulp.task('build:extension', ) ) -gulp.task('build:mascara', - gulp.series( - 'clean', - 'build:scss', - gulp.parallel( - 'build:mascara:js', - 'copy' - ) - ) -) - gulp.task('dist', gulp.series( 'build', diff --git a/mascara/README.md b/mascara/README.md deleted file mode 100644 index 6e3bfe96beed..000000000000 --- a/mascara/README.md +++ /dev/null @@ -1,33 +0,0 @@ -start the dual servers (dapp + mascara) -``` -npm run mascara -``` - -### First time use: - -- navigate to: http://localhost:9001 -- Create an Account -- go back to http://localhost:9002 -- open devTools -- click Sync Tx - -### Tests: - -``` -npm run testMascara -``` - -Test will run in browser, you will have to have these browsers installed: - -- Chrome -- Firefox -- Opera - - -### Deploy: - -Will build and deploy mascara via docker - -``` -docker-compose build && docker-compose stop && docker-compose up -d && docker-compose logs --tail 200 -f -``` \ No newline at end of file diff --git a/mascara/example/app.js b/mascara/example/app.js deleted file mode 100644 index 7b6421fdca1a..000000000000 --- a/mascara/example/app.js +++ /dev/null @@ -1,38 +0,0 @@ -const EthQuery = require('ethjs-query') - -window.addEventListener('load', loadProvider) -window.addEventListener('message', console.warn) - -async function loadProvider () { - const ethereumProvider = window.metamask.createDefaultProvider({ host: 'http://localhost:9001' }) - const ethQuery = new EthQuery(ethereumProvider) - const accounts = await ethQuery.accounts() - window.METAMASK_ACCOUNT = accounts[0] || 'locked' - logToDom(accounts.length ? accounts[0] : 'LOCKED or undefined', 'account') - setupButtons(ethQuery) -} - - -function logToDom (message, context) { - document.getElementById(context).innerText = message - console.log(message) -} - -function setupButtons (ethQuery) { - const accountButton = document.getElementById('action-button-1') - accountButton.addEventListener('click', async () => { - const accounts = await ethQuery.accounts() - window.METAMASK_ACCOUNT = accounts[0] || 'locked' - logToDom(accounts.length ? accounts[0] : 'LOCKED or undefined', 'account') - }) - const txButton = document.getElementById('action-button-2') - txButton.addEventListener('click', async () => { - if (!window.METAMASK_ACCOUNT || window.METAMASK_ACCOUNT === 'locked') return - const txHash = await ethQuery.sendTransaction({ - from: window.METAMASK_ACCOUNT, - to: window.METAMASK_ACCOUNT, - data: '', - }) - logToDom(txHash, 'cb-value') - }) -} diff --git a/mascara/example/app/index.html b/mascara/example/app/index.html deleted file mode 100644 index 8afb6f3f2ae3..000000000000 --- a/mascara/example/app/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - MetaMask ZeroClient Example - - - - -
- -
- - - \ No newline at end of file diff --git a/mascara/example/server.js b/mascara/example/server.js deleted file mode 100644 index bdb1efa16b80..000000000000 --- a/mascara/example/server.js +++ /dev/null @@ -1,31 +0,0 @@ -const express = require('express') -const path = require('path') -const createMetamascaraServer = require('../server/') -const createBundle = require('../server/util').createBundle -const serveBundle = require('../server/util').serveBundle -// -// Iframe Server -// - -const mascaraServer = createMetamascaraServer() - -// start the server -const mascaraPort = 9001 -mascaraServer.listen(mascaraPort) -console.log(`Mascara service listening on port ${mascaraPort}`) - - -// -// Dapp Server -// - -const dappServer = express() - -// serve dapp bundle -serveBundle(dappServer, '/app.js', createBundle(require.resolve('./app.js'))) -dappServer.use(express.static(path.join(__dirname, '/app/'))) - -// start the server -const dappPort = '9002' -dappServer.listen(dappPort) -console.log(`Dapp listening on port ${dappPort}`) diff --git a/mascara/proxy/index.html b/mascara/proxy/index.html deleted file mode 100644 index 4e167db72753..000000000000 --- a/mascara/proxy/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - MetaMask ZeroClient Iframe - - - - - - - - Hello! I am the MetaMask iframe. - - - diff --git a/mascara/server/index.js b/mascara/server/index.js deleted file mode 100644 index a30120438212..000000000000 --- a/mascara/server/index.js +++ /dev/null @@ -1,21 +0,0 @@ -const path = require('path') -const express = require('express') -const compression = require('compression') - -module.exports = createMetamascaraServer - - -function createMetamascaraServer () { - - // setup server - const server = express() - server.use(compression()) - - // serve assets - server.use(express.static(path.join(__dirname, '/../ui/'), { setHeaders: (res) => res.set('X-Frame-Options', 'DENY') })) - server.use(express.static(path.join(__dirname, '/../../dist/mascara'))) - server.use(express.static(path.join(__dirname, '/../proxy'))) - - return server - -} diff --git a/mascara/server/util.js b/mascara/server/util.js deleted file mode 100644 index f9692afb6065..000000000000 --- a/mascara/server/util.js +++ /dev/null @@ -1,47 +0,0 @@ -const browserify = require('browserify') -const watchify = require('watchify') - -module.exports = { - serveBundle, - createBundle, -} - - -function serveBundle (server, path, bundle) { - server.get(path, function (req, res) { - res.setHeader('Content-Type', 'application/javascript; charset=UTF-8') - res.send(bundle.latest) - }) -} - -function createBundle (entryPoint) { - - var bundleContainer = {} - - var bundler = browserify({ - entries: [entryPoint], - cache: {}, - packageCache: {}, - plugin: [watchify], - }) - .transform('babelify') - .transform('uglifyify', { global: true }) - - bundler.on('update', bundle) - bundle() - - return bundleContainer - - function bundle () { - bundler.bundle(function (err, result) { - if (err) { - console.log(`Bundle failed! (${entryPoint})`) - console.error(err) - return - } - console.log(`Bundle updated! (${entryPoint})`) - bundleContainer.latest = result.toString() - }) - } - -} diff --git a/mascara/src/app/buy-ether-widget/index.js b/mascara/src/app/buy-ether-widget/index.js index c8530ba4c71b..d0d6ff343699 100644 --- a/mascara/src/app/buy-ether-widget/index.js +++ b/mascara/src/app/buy-ether-widget/index.js @@ -5,7 +5,7 @@ import {connect} from 'react-redux' import {qrcode} from 'qrcode-generator' import copyToClipboard from 'copy-to-clipboard' import ShapeShiftForm from '../shapeshift-form' -import {buyEth, showAccountDetail} from '../../../../ui/app/actions' +import {buyEth, showAccountDetail} from '../../../../ui/app/store/actions' const OPTION_VALUES = { COINBASE: 'coinbase', diff --git a/mascara/src/app/shapeshift-form/index.js b/mascara/src/app/shapeshift-form/index.js index fe7f7ffcb0c3..c044f9ecc6e7 100644 --- a/mascara/src/app/shapeshift-form/index.js +++ b/mascara/src/app/shapeshift-form/index.js @@ -3,8 +3,8 @@ import PropTypes from 'prop-types' import classnames from 'classnames' import qrcode from 'qrcode-generator' import {connect} from 'react-redux' -import {shapeShiftSubview, pairUpdate, buyWithShapeShift} from '../../../../ui/app/actions' -import {isValidAddress} from '../../../../ui/app/util' +import {shapeShiftSubview, pairUpdate, buyWithShapeShift} from '../../../../ui/app/store/actions' +import {isValidAddress} from '../../../../ui/app/helpers/utils/util' export class ShapeShiftForm extends Component { static propTypes = { diff --git a/mascara/src/background.js b/mascara/src/background.js deleted file mode 100644 index d8d1c8c54770..000000000000 --- a/mascara/src/background.js +++ /dev/null @@ -1,134 +0,0 @@ -global.window = global - -const SwGlobalListener = require('sw-stream/lib/sw-global-listener.js') -const connectionListener = new SwGlobalListener(global) -const setupMultiplex = require('../../app/scripts/lib/stream-utils.js').setupMultiplex - -const DbController = require('idb-global') - -const SwPlatform = require('../../app/scripts/platforms/sw') -const MetamaskController = require('../../app/scripts/metamask-controller') - -const Migrator = require('../../app/scripts/lib/migrator/') -const migrations = require('../../app/scripts/migrations/') -const firstTimeState = require('../../app/scripts/first-time-state') - -const STORAGE_KEY = 'metamask-config' -const METAMASK_DEBUG = process.env.METAMASK_DEBUG -global.metamaskPopupIsOpen = false - -const log = require('loglevel') -global.log = log -log.setDefaultLevel(METAMASK_DEBUG ? 'debug' : 'warn') - -global.addEventListener('install', function (event) { - event.waitUntil(global.skipWaiting()) -}) -global.addEventListener('activate', function (event) { - event.waitUntil(global.clients.claim()) -}) - -log.debug('inside:open') - -// state persistence -const dbController = new DbController({ - key: STORAGE_KEY, -}) - -start().catch(log.error) - -async function start () { - log.debug('MetaMask initializing...') - const initState = await loadStateFromPersistence() - await setupController(initState) - log.debug('MetaMask initialization complete.') -} - -// -// State and Persistence -// -async function loadStateFromPersistence () { - // migrations - const migrator = new Migrator({ migrations }) - const initialState = migrator.generateInitialState(firstTimeState) - dbController.initialState = initialState - const versionedData = await dbController.open() - const migratedData = await migrator.migrateData(versionedData) - await dbController.put(migratedData) - return migratedData.data -} - -async function setupController (initState, client) { - - // - // MetaMask Controller - // - - const platform = new SwPlatform() - - const controller = new MetamaskController({ - // platform specific implementation - platform, - // User confirmation callbacks: - showUnconfirmedMessage: noop, - unlockAccountMessage: noop, - showUnapprovedTx: noop, - // initial state - initState, - }) - global.metamaskController = controller - - controller.store.subscribe(async (state) => { - try { - const versionedData = await versionifyData(state) - await dbController.put(versionedData) - } catch (e) { console.error('METAMASK Error:', e) } - }) - - async function versionifyData (state) { - const rawData = await dbController.get() - return { - data: state, - meta: rawData.meta, - } - } - - // - // connect to other contexts - // - - connectionListener.on('remote', (portStream, messageEvent) => { - log.debug('REMOTE CONECTION FOUND***********') - connectRemote(portStream, messageEvent.data.context) - }) - - function connectRemote (connectionStream, context) { - var isMetaMaskInternalProcess = (context === 'popup') - if (isMetaMaskInternalProcess) { - // communication with popup - controller.setupTrustedCommunication(connectionStream, 'MetaMask') - global.metamaskPopupIsOpen = true - } else { - // communication with page - setupUntrustedCommunication(connectionStream, context) - } - } - - function setupUntrustedCommunication (connectionStream, originDomain) { - // setup multiplexing - var mx = setupMultiplex(connectionStream) - // connect features - controller.setupProviderConnection(mx.createStream('provider'), originDomain) - controller.setupPublicConfig(mx.createStream('publicConfig')) - } -} -// // this will be useful later but commented out for linting for now (liiiinting) -// function sendMessageToAllClients (message) { -// global.clients.matchAll().then(function (clients) { -// clients.forEach(function (client) { -// client.postMessage(message) -// }) -// }) -// } - -function noop () {} diff --git a/mascara/src/metamascara.js b/mascara/src/metamascara.js deleted file mode 100644 index 0af6f532fb27..000000000000 --- a/mascara/src/metamascara.js +++ /dev/null @@ -1 +0,0 @@ -global.metamask = require('metamascara') diff --git a/mascara/src/proxy.js b/mascara/src/proxy.js deleted file mode 100644 index 80b4dc516c1b..000000000000 --- a/mascara/src/proxy.js +++ /dev/null @@ -1,25 +0,0 @@ -const createParentStream = require('iframe-stream').ParentStream -const SwController = require('sw-controller') -const SwStream = require('sw-stream/lib/sw-stream.js') - -const keepAliveDelay = Math.floor(Math.random() * (30000 - 1000)) + 1000 -const background = new SwController({ - fileName: './scripts/background.js', - keepAlive: true, - keepAliveInterval: 30000, - keepAliveDelay, -}) - -const pageStream = createParentStream() -background.on('ready', () => { - const swStream = SwStream({ - serviceWorker: background.controller, - context: 'dapp', - }) - pageStream.pipe(swStream).pipe(pageStream) - -}) -background.on('updatefound', () => window.location.reload()) - -background.on('error', console.error) -background.startWorker() diff --git a/mascara/src/ui.js b/mascara/src/ui.js deleted file mode 100644 index f9e7670eafd1..000000000000 --- a/mascara/src/ui.js +++ /dev/null @@ -1,73 +0,0 @@ -const injectCss = require('inject-css') -const SwController = require('sw-controller') -const SwStream = require('sw-stream') -const MetaMaskUiCss = require('../../ui/css') -const MetamascaraPlatform = require('../../app/scripts/platforms/window') -const startPopup = require('../../app/scripts/popup-core') - -// create platform global -global.platform = new MetamascaraPlatform() - -var css = MetaMaskUiCss() -injectCss(css) -const container = document.getElementById('app-content') - -const name = 'popup' -window.METAMASK_UI_TYPE = name -window.METAMASK_PLATFORM_TYPE = 'mascara' - -const keepAliveDelay = Math.floor(Math.random() * (30000 - 1000)) + 1000 - -const swController = new SwController({ - fileName: './background.js', - keepAlive: true, - keepAliveDelay, - keepAliveInterval: 20000, -}) - -swController.once('updatefound', windowReload) -swController.once('ready', async () => { - try { - swController.removeListener('updatefound', windowReload) - console.log('swController ready') - await timeout(1000) - console.log('connecting to app') - await connectApp() - console.log('app connected') - } catch (err) { - console.error(err) - } -}) - -console.log('starting service worker') -swController.startWorker() - -// Setup listener for when the service worker is read -function connectApp () { - const connectionStream = SwStream({ - serviceWorker: swController.getWorker(), - context: name, - }) - return new Promise((resolve, reject) => { - startPopup({ container, connectionStream }, (err, store) => { - console.log('hello from MetaMascara ui!') - if (err) reject(err) - store.subscribe(() => { - const state = store.getState() - if (state.appState.shouldClose) window.close() - }) - resolve() - }) - }) -} - -function windowReload () { - if (window.METAMASK_SKIP_RELOAD) return - window.location.reload() -} - -function timeout (time) { - return new Promise((resolve) => { - setTimeout(resolve, time || 1500) - }) -} diff --git a/mascara/test/helpers.js b/mascara/test/helpers.js deleted file mode 100644 index 8fc5c816bda9..000000000000 --- a/mascara/test/helpers.js +++ /dev/null @@ -1,7 +0,0 @@ -export default function wait (time) { - return new Promise(function (resolve, reject) { - setTimeout(function () { - resolve() - }, time * 3 || 1500) - }) -} diff --git a/mascara/test/index.js b/mascara/test/index.js deleted file mode 100644 index d62e43705d06..000000000000 --- a/mascara/test/index.js +++ /dev/null @@ -1,22 +0,0 @@ -var fs = require('fs') -var path = require('path') -var browserify = require('browserify') -var tests = fs.readdirSync(path.join(__dirname, 'lib')) -var bundlePath = path.join(__dirname, 'test-bundle.js') -var b = browserify() - -// Remove old bundle -try { - fs.unlinkSync(bundlePath) -} catch (e) { - console.error(e) -} - -var writeStream = fs.createWriteStream(bundlePath) - -tests.forEach(function (fileName) { - b.add(path.join(__dirname, 'lib', fileName)) -}) - -b.bundle().pipe(writeStream) - diff --git a/mascara/test/jquery-3.1.0.min.js b/mascara/test/jquery-3.1.0.min.js deleted file mode 100644 index f6a6a99e60ee..000000000000 --- a/mascara/test/jquery-3.1.0.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v3.1.0 | (c) jQuery Foundation | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?a<0?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0, -r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;d0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K); -if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" - - diff --git a/package-lock.json b/package-lock.json index b10935026479..d753a1e9e6b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1878,6 +1878,7 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "dev": true, "requires": { "mime-types": "~2.1.16", "negotiator": "0.6.1" @@ -3045,7 +3046,8 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true }, "array-from": { "version": "2.1.1", @@ -4761,6 +4763,15 @@ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", "dev": true }, + "backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", + "dev": true, + "requires": { + "precond": "0.2" + } + }, "bail": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.2.tgz", @@ -4964,6 +4975,7 @@ "version": "1.18.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", @@ -6439,30 +6451,6 @@ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "dev": true }, - "compressible": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", - "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", - "dev": true, - "requires": { - "mime-db": ">= 1.30.0 < 2" - } - }, - "compression": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", - "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "bytes": "3.0.0", - "compressible": "~2.0.11", - "debug": "2.6.9", - "on-headers": "~1.0.1", - "safe-buffer": "5.1.1", - "vary": "~1.1.2" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -6544,12 +6532,14 @@ "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true }, "content-type-parser": { "version": "1.0.2", @@ -6571,12 +6561,14 @@ "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true }, "cookiejar": { "version": "2.1.2", @@ -7813,7 +7805,8 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true }, "detect-file": { "version": "1.0.0", @@ -8702,7 +8695,8 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true }, "electron-releases": { "version": "2.1.0", @@ -8747,7 +8741,8 @@ "encodeurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "dev": true }, "encoding": { "version": "0.1.12", @@ -9134,7 +9129,8 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true }, "escape-string-regexp": { "version": "1.0.5", @@ -9627,7 +9623,8 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true }, "eth-bin-to-ops": { "version": "1.0.1", @@ -9799,7 +9796,7 @@ "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "ethereumjs-util": "^5.1.1" }, "dependencies": { @@ -9807,8 +9804,8 @@ "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } } } @@ -9817,8 +9814,8 @@ "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } }, "ethereumjs-util": { @@ -9852,7 +9849,7 @@ "dependencies": { "babelify": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", "requires": { "babel-core": "^6.0.14", @@ -9889,26 +9886,26 @@ "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "ethereumjs-util": "^5.1.1" }, "dependencies": { "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } } } }, "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } }, "ethereumjs-util": { @@ -10068,7 +10065,7 @@ "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", "dev": true, "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "ethereumjs-util": "^5.1.1" }, "dependencies": { @@ -10077,8 +10074,8 @@ "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "dev": true, "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } } } @@ -10087,8 +10084,8 @@ "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } }, "ethereumjs-util": { @@ -10192,11 +10189,11 @@ } }, "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } }, "ethereumjs-util": { @@ -10267,8 +10264,8 @@ "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } }, "ethereumjs-tx": { @@ -10487,11 +10484,11 @@ } }, "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } }, "ethereumjs-util": { @@ -10681,8 +10678,18 @@ "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "ethereumjs-util": "^5.1.1" + }, + "dependencies": { + "ethereumjs-abi": { + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", + "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "requires": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + } } }, "ethereum-common": { @@ -10694,8 +10701,8 @@ "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } }, "ethereumjs-tx": { @@ -11698,6 +11705,7 @@ "version": "4.16.2", "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "dev": true, "requires": { "accepts": "~1.3.4", "array-flatten": "1.1.1", @@ -12157,6 +12165,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.1", @@ -12737,7 +12746,8 @@ "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true }, "fragment-cache": { "version": "0.2.1", @@ -12751,7 +12761,8 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true }, "from": { "version": "0.1.7", @@ -12960,6 +12971,253 @@ "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.2.0.tgz", "integrity": "sha1-8ESOgGmFW/Kj5oPNwdMg5+KgfvQ=" }, + "gaba": { + "version": "1.0.0-beta.65", + "resolved": "https://registry.npmjs.org/gaba/-/gaba-1.0.0-beta.65.tgz", + "integrity": "sha512-pX9hMd4RR5AXe7bwIamQEXLJe26fNvjOf7PjkHGKlRjKzBYmxZ03Y/Pa9nklNlG2Shc9sSgB6GXZpYlXNlJRIg==", + "dev": true, + "requires": { + "await-semaphore": "^0.1.3", + "eth-contract-metadata": "github:MetaMask/eth-contract-metadata#faa4f56fb17b3ae8579df68708be59d617732f31", + "eth-json-rpc-infura": "^3.1.2", + "eth-keyring-controller": "^4.0.0", + "eth-phishing-detect": "^1.1.13", + "eth-query": "^2.1.2", + "eth-sig-util": "^2.1.0", + "ethereumjs-util": "^5.2.0", + "ethereumjs-wallet": "0.6.0", + "ethjs-query": "^0.3.8", + "human-standard-collectible-abi": "^1.0.2", + "human-standard-token-abi": "^2.0.0", + "isomorphic-fetch": "^2.2.1", + "jsonschema": "^1.2.4", + "percentile": "^1.2.1", + "single-call-balance-checker-abi": "^1.0.0", + "uuid": "^3.3.2", + "web3": "^0.20.7", + "web3-provider-engine": "github:metamask/provider-engine#e91367bc2c2535fbf7add06244d9d4ec98620042" + }, + "dependencies": { + "babelify": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", + "dev": true, + "requires": { + "babel-core": "^6.0.14", + "object-assign": "^4.0.0" + } + }, + "bignumber.js": { + "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", + "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git", + "dev": true + }, + "eth-contract-metadata": { + "version": "github:MetaMask/eth-contract-metadata#faa4f56fb17b3ae8579df68708be59d617732f31", + "from": "github:MetaMask/eth-contract-metadata#faa4f56fb17b3ae8579df68708be59d617732f31", + "dev": true + }, + "eth-hd-keyring": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eth-hd-keyring/-/eth-hd-keyring-2.0.0.tgz", + "integrity": "sha512-lTeANNPNj/j08sWU7LUQZTsx9NUJaUsiOdVxeP0UI5kke7L+Sd7zJWBmCShudEVG8PkqKLE1KJo08o430sl6rw==", + "dev": true, + "requires": { + "bip39": "^2.2.0", + "eth-sig-util": "^2.0.1", + "ethereumjs-abi": "^0.6.5", + "ethereumjs-util": "^5.1.1", + "ethereumjs-wallet": "^0.6.0", + "events": "^1.1.1", + "xtend": "^4.0.1" + } + }, + "eth-keyring-controller": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eth-keyring-controller/-/eth-keyring-controller-4.0.1.tgz", + "integrity": "sha512-i+aff88wsDdgf99iPNE1/RwNos1EtMk0vmc1nsiaCBxrMJSMyNrqEB0njrv2TYWiJj5TnUaZ63vSUYoUYp2eHg==", + "dev": true, + "requires": { + "bip39": "^2.4.0", + "bluebird": "^3.5.0", + "browser-passworder": "^2.0.3", + "eth-hd-keyring": "^2.0.0", + "eth-sig-util": "^1.4.0", + "eth-simple-keyring": "^2.0.0", + "ethereumjs-util": "^5.1.2", + "loglevel": "^1.5.0", + "obs-store": "^2.4.1", + "promise-filter": "^1.1.0" + }, + "dependencies": { + "eth-sig-util": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", + "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", + "dev": true, + "requires": { + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "ethereumjs-util": "^5.1.1" + } + }, + "ethereumjs-abi": { + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#572d4bafe08a8a231137e1f9daeb0f8a23f197d2", + "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "dev": true, + "requires": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + }, + "dependencies": { + "ethereumjs-util": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", + "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "0.1.6", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + } + } + }, + "ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + } + } + }, + "eth-phishing-detect": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/eth-phishing-detect/-/eth-phishing-detect-1.1.13.tgz", + "integrity": "sha512-1KQcKvAQIjJgFMVwxaw2+BlzM9Momzl0e+/torPdMjg7WGq6LmCIS7ddg84diH5zIQp9quGyRVIEawCCuErgVQ==", + "dev": true, + "requires": { + "fast-levenshtein": "^2.0.6" + } + }, + "eth-sig-util": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.1.2.tgz", + "integrity": "sha512-bNgt7txkEmaNlLf+PrbwYIdp4KRkB3E7hW0/QwlBpgv920pVVyQnF0evoovfiRveNKM4OrtPYZTojjmsfuCUOw==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "elliptic": "^6.4.0", + "ethereumjs-abi": "0.6.5", + "ethereumjs-util": "^5.1.1", + "tweetnacl": "^1.0.0", + "tweetnacl-util": "^0.15.0" + } + }, + "eth-simple-keyring": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eth-simple-keyring/-/eth-simple-keyring-2.0.0.tgz", + "integrity": "sha512-4dMbkIy2k1qotDTjWINvXG+7tBmofp0YUhlXgcG0+I3w684V46+MAHEkBtD2Y09iEeIB07RDXrezKP9WxOpynA==", + "dev": true, + "requires": { + "eth-sig-util": "^2.0.1", + "ethereumjs-abi": "^0.6.5", + "ethereumjs-util": "^5.1.1", + "ethereumjs-wallet": "^0.6.0", + "events": "^1.1.1", + "xtend": "^4.0.1" + } + }, + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "^0.1.3", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "ethjs-query": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.3.8.tgz", + "integrity": "sha512-/J5JydqrOzU8O7VBOwZKUWXxHDGr46VqNjBCJgBVNNda+tv7Xc8Y2uJc6aMHHVbeN3YOQ7YRElgIc0q1CI02lQ==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "ethjs-format": "0.2.7", + "ethjs-rpc": "0.2.0", + "promise-to-callback": "^1.0.0" + } + }, + "ethjs-rpc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ethjs-rpc/-/ethjs-rpc-0.2.0.tgz", + "integrity": "sha512-RINulkNZTKnj4R/cjYYtYMnFFaBcVALzbtEJEONrrka8IeoarNB9Jbzn+2rT00Cv8y/CxAI+GgY1d0/i2iQeOg==", + "dev": true, + "requires": { + "promise-to-callback": "^1.0.0" + } + }, + "obs-store": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/obs-store/-/obs-store-2.4.1.tgz", + "integrity": "sha512-wpA8G4uSn8cnCKZ0pFTvqsamvy0Sm1hR2ot0Qonbfj5yBMwdAp/eD4vDI+U/ZCbV1hb2V5GapL8YKUdGCvahgg==", + "dev": true, + "requires": { + "babel-preset-es2015": "^6.22.0", + "babelify": "^7.3.0", + "readable-stream": "^2.2.2", + "through2": "^2.0.3", + "xtend": "^4.0.1" + } + }, + "percentile": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/percentile/-/percentile-1.2.1.tgz", + "integrity": "sha512-lZtxLEQeDfWtYZf84T/qw3QqfbnKujhxKqTzHIfFAmcfYYcjUFwf3NuCnG3DDqBPjrESgNAhLI15SnSOALBQXw==", + "dev": true + }, + "tweetnacl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.1.tgz", + "integrity": "sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A==", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "web3": { + "version": "0.20.7", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.7.tgz", + "integrity": "sha512-VU6/DSUX93d1fCzBz7WP/SGCQizO1rKZi4Px9j/3yRyfssHyFcZamMw2/sj4E8TlfMXONvZLoforR8B4bRoyTQ==", + "dev": true, + "requires": { + "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git", + "crypto-js": "^3.1.4", + "utf8": "^2.1.1", + "xhr2-cookies": "^1.1.0", + "xmlhttprequest": "*" + } + } + } + }, "ganache-cli": { "version": "6.1.6", "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.1.6.tgz", @@ -12994,9 +13252,9 @@ } }, "ganache-core": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.3.1.tgz", - "integrity": "sha512-I4t4P+LYUZRnGbxDseqSa5vIJ8C5e35vw5Fr7f2iMMN6jmO5TVjWWgNib60G2iL+XTbYUFmou040hHxrTaNtnA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.5.3.tgz", + "integrity": "sha512-lTqPSxgWS5p4zJ8yNbhhsBXMPfcuV+jjnnYtsbJTph9L6InA6UkNpO0hhHuDFWF3GpblP3LjvWPpqW+X6pdZGg==", "dev": true, "requires": { "abstract-leveldown": "3.0.0", @@ -13010,17 +13268,19 @@ "eth-sig-util": "2.0.2", "ethereumjs-abi": "0.6.5", "ethereumjs-account": "2.0.5", - "ethereumjs-block": "1.2.2", + "ethereumjs-block": "2.1.0", "ethereumjs-tx": "1.3.7", "ethereumjs-util": "5.2.0", - "ethereumjs-vm": "2.4.0", + "ethereumjs-vm": "^2.6.0", "ethereumjs-wallet": "0.6.2", "heap": "0.2.6", "level-sublevel": "6.6.4", "levelup": "3.1.1", - "lodash": "4.17.10", + "lodash": "4.17.11", "merkle-patricia-tree": "2.3.1", + "rlp": "2.1.0", "seedrandom": "2.4.4", + "source-map-support": "0.5.9", "tmp": "0.0.33", "web3": "1.0.0-beta.35", "web3-provider-engine": "14.1.0", @@ -13041,6 +13301,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "dev": true, + "optional": true, "requires": { "mime-types": "~2.1.18", "negotiator": "0.6.1" @@ -13054,9 +13315,9 @@ "optional": true }, "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz", + "integrity": "sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -13081,13 +13342,15 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true + "dev": true, + "optional": true }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "dev": true, + "optional": true }, "asn1": { "version": "0.2.4", @@ -13103,6 +13366,7 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, + "optional": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -13203,6 +13467,12 @@ "requires": { "ms": "2.0.0" } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -13224,9 +13494,15 @@ "dependencies": { "jsesc": { "version": "1.3.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -13387,13 +13663,13 @@ }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", "dev": true }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", "dev": true }, @@ -13731,6 +14007,12 @@ "source-map-support": "^0.4.15" }, "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", @@ -13807,7 +14089,7 @@ }, "babelify": { "version": "7.3.0", - "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", "dev": true, "requires": { @@ -13833,7 +14115,8 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "base-x": { "version": "3.0.5", @@ -13862,10 +14145,13 @@ } }, "bindings": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", - "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==", - "dev": true + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "requires": { + "file-uri-to-path": "1.0.0" + } }, "bip39": { "version": "2.5.0", @@ -13891,9 +14177,10 @@ }, "bl": { "version": "1.2.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, + "optional": true, "requires": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -13927,6 +14214,7 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "dev": true, + "optional": true, "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", @@ -13945,6 +14233,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "optional": true, "requires": { "ms": "2.0.0" } @@ -13955,6 +14244,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -13968,7 +14258,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -14007,21 +14297,23 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, + "optional": true, "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" } }, "browserify-sha3": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", - "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.4.tgz", + "integrity": "sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY=", "dev": true, "requires": { - "js-sha3": "^0.3.1" + "js-sha3": "^0.6.1", + "safe-buffer": "^5.1.1" } }, "browserify-sign": { @@ -14088,6 +14380,7 @@ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, + "optional": true, "requires": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -14097,7 +14390,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true + "dev": true, + "optional": true }, "buffer-crc32": { "version": "0.2.13", @@ -14110,7 +14404,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true + "dev": true, + "optional": true }, "buffer-from": { "version": "1.1.1", @@ -14122,7 +14417,8 @@ "version": "0.0.5", "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=", - "dev": true + "dev": true, + "optional": true }, "buffer-xor": { "version": "1.0.3", @@ -14130,17 +14426,12 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "dev": true, + "optional": true }, "bytewise": { "version": "1.1.0", @@ -14189,9 +14480,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30000907", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000907.tgz", - "integrity": "sha512-No5sQ/OB2Nmka8MNOOM6nJx+Hxt6MQ6h7t7kgJFu9oTuwjykyKRSBP/+i/QAyFHxeHB+ddE0Da1CG5ihx9oehQ==", + "version": "1.0.30000939", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000939.tgz", + "integrity": "sha512-oXB23ImDJOgQpGjRv1tCtzAvJr4/OvrHi5SO2vUgB0g0xpdZZoA/BxfImiWfdwoYdUTtQrPsXsvYU/dmCSM8gg==", "dev": true }, "caseless": { @@ -14202,7 +14493,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14286,9 +14577,10 @@ }, "commander": { "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, + "optional": true, "requires": { "graceful-readlink": ">= 1.0.0" } @@ -14296,7 +14588,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -14314,13 +14607,15 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true + "dev": true, + "optional": true }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "dev": true, + "optional": true }, "convert-source-map": { "version": "1.6.0", @@ -14335,24 +14630,27 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true + "dev": true, + "optional": true }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "dev": true, + "optional": true }, "cookiejar": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true + "dev": true, + "optional": true }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", "dev": true }, "core-util-is": { @@ -14366,6 +14664,7 @@ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, + "optional": true, "requires": { "object-assign": "^4", "vary": "^1" @@ -14384,7 +14683,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -14397,7 +14696,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -14467,7 +14766,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "dev": true, + "optional": true }, "decompress": { "version": "4.2.0", @@ -14488,7 +14788,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true, "optional": true @@ -14500,6 +14800,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "dev": true, + "optional": true, "requires": { "mimic-response": "^1.0.0" } @@ -14509,6 +14810,7 @@ "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", "dev": true, + "optional": true, "requires": { "file-type": "^5.2.0", "is-stream": "^1.1.0", @@ -14565,14 +14867,14 @@ "dependencies": { "file-type": { "version": "3.9.0", - "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", "dev": true, "optional": true }, "get-stream": { "version": "2.3.1", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "dev": true, "optional": true, @@ -14583,7 +14885,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true, "optional": true @@ -14626,9 +14928,9 @@ }, "dependencies": { "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", "dev": true } } @@ -14649,7 +14951,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "dev": true, + "optional": true }, "des.js": { "version": "1.0.0", @@ -14666,7 +14969,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "dev": true, + "optional": true }, "detect-indent": { "version": "4.0.0", @@ -14679,7 +14983,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "optional": true, @@ -14710,7 +15014,8 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "dev": true, + "optional": true }, "ecc-jsbn": { "version": "0.1.2", @@ -14726,12 +15031,13 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "dev": true, + "optional": true }, "electron-to-chromium": { - "version": "1.3.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz", - "integrity": "sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw==", + "version": "1.3.113", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz", + "integrity": "sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==", "dev": true }, "elliptic": { @@ -14753,7 +15059,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "dev": true, + "optional": true }, "encoding": { "version": "0.1.12", @@ -14816,16 +15123,25 @@ } }, "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, "requires": { - "es-to-primitive": "^1.1.1", + "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + }, + "dependencies": { + "object-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", + "dev": true + } } }, "es-to-primitive": { @@ -14843,7 +15159,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "dev": true, + "optional": true }, "escape-string-regexp": { "version": "1.0.5", @@ -14861,7 +15178,8 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "dev": true, + "optional": true }, "eth-block-tracker": { "version": "3.0.1", @@ -14880,16 +15198,16 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } } }, "eth-json-rpc-infura": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.1.2.tgz", - "integrity": "sha512-IuK5Iowfs6taluA/3Okmu6EfZcFMq6MQuyrUL1PrCoJstuuBr3TvVeSy3keDyxfbrjFB34nCo538I8G+qMtsbw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.0.tgz", + "integrity": "sha512-FLcpdxPRVBCUc7yoE+wHGvyYg2lATedP+/q7PsKvaSzQpJbgTG4ZjLnyrLanxDr6M1k/dSNa6V5QnILwjUKJcw==", "dev": true, "requires": { "cross-fetch": "^2.1.1", @@ -14901,7 +15219,7 @@ }, "eth-json-rpc-middleware": { "version": "1.6.0", - "resolved": "http://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", + "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==", "dev": true, "requires": { @@ -14928,7 +15246,7 @@ }, "ethereumjs-block": { "version": "1.7.1", - "resolved": "http://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", "dev": true, "requires": { @@ -14946,6 +15264,7 @@ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", "dev": true, + "optional": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -15029,7 +15348,7 @@ "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", "dev": true, "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "ethereumjs-util": "^5.1.1" } }, @@ -15044,13 +15363,13 @@ "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "dev": true, "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } }, "ethereumjs-block": { "version": "1.7.1", - "resolved": "http://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", "dev": true, "requires": { @@ -15082,8 +15401,9 @@ }, "fs-extra": { "version": "0.30.0", - "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -15094,7 +15414,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -15104,9 +15424,22 @@ "integrity": "sha512-bAkNqSHYdJdFsBC7Z11JgzYktL31HIpB2o70jZcGiL1U1TVtPyvaVhDrGWwS8uZtaqwW2k6NOPGZCqW/Dgh5Lg==", "dev": true }, + "solc": { + "version": "0.4.25", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.25.tgz", + "integrity": "sha512-jU1YygRVy6zatgXrLY2rRm7HW1d7a8CkkEgNJwvH2VLpWhMFsMdWcJn6kUqZwcSz/Vm+w89dy7Z/aB5p6AFTrg==", + "dev": true, + "requires": { + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" + } + }, "web3-provider-engine": { "version": "13.8.0", - "resolved": "http://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-13.8.0.tgz", + "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-13.8.0.tgz", "integrity": "sha512-fZXhX5VWwWpoFfrfocslyg6P7cN3YWPG/ASaevNfeO80R+nzgoPUBXcWQekSGSsNDkeRTis4aMmpmofYf1TNtQ==", "dev": true, "requires": { @@ -15134,9 +15467,9 @@ } }, "ethereum-common": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.16.tgz", - "integrity": "sha1-mh4Wnq00q3XgifUMpRK/0PvRJlU=", + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", + "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=", "dev": true }, "ethereumjs-abi": { @@ -15151,7 +15484,7 @@ "dependencies": { "ethereumjs-util": { "version": "4.5.0", - "resolved": "http://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", "dev": true, "requires": { @@ -15176,43 +15509,22 @@ } }, "ethereumjs-block": { - "version": "1.2.2", - "resolved": "http://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.2.2.tgz", - "integrity": "sha1-LsdTSlkCG47JuDww5JaQxuuu3aE=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.1.0.tgz", + "integrity": "sha512-ip+x4/7hUInX+TQfhEKsQh9MJK1Dbjp4AuPjf1UdX3udAV4beYD4EMCNIPzBLCsGS8WQZYXLpo83tVTISYNpow==", "dev": true, "requires": { - "async": "^1.5.2", - "ethereum-common": "0.0.16", - "ethereumjs-tx": "^1.0.0", - "ethereumjs-util": "^4.0.1", + "async": "^2.0.1", + "ethereumjs-common": "^0.6.0", + "ethereumjs-tx": "^1.2.2", + "ethereumjs-util": "^5.0.0", "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "http://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "dev": true, - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" - } - } } }, "ethereumjs-common": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-0.4.1.tgz", - "integrity": "sha512-ywYGsOeGCsMNWso5Y4GhjWI24FJv9FK7+VyVKiQgXg8ZRDPXJ7F/kJ1CnjtkjTvDF4e0yqU+FWswlqR3bmZQ9Q==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-0.6.1.tgz", + "integrity": "sha512-4jOrfDu9qOBTTGGb3zrfT1tE1Hyc6a8LJpEk0Vk9AYlLkBY7crjVICyJpRvjNI+KLDMpMITMw3eWVZOLMtZdhw==", "dev": true }, "ethereumjs-tx": { @@ -15223,14 +15535,6 @@ "requires": { "ethereum-common": "^0.0.18", "ethereumjs-util": "^5.0.0" - }, - "dependencies": { - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=", - "dev": true - } } }, "ethereumjs-util": { @@ -15249,41 +15553,142 @@ } }, "ethereumjs-vm": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.4.0.tgz", - "integrity": "sha512-MJ4lCWa5c6LhahhhvoDKW+YGjK00ZQn0RHHLh4L+WaH1k6Qv7/q3uTluew6sJGNCZdlO0yYMDXYW9qyxLHKlgQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", + "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", "dev": true, "requires": { "async": "^2.1.2", "async-eventemitter": "^0.2.2", "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~1.7.0", - "ethereumjs-common": "~0.4.0", - "ethereumjs-util": "^5.2.0", + "ethereumjs-block": "~2.2.0", + "ethereumjs-common": "^1.1.0", + "ethereumjs-util": "^6.0.0", "fake-merkle-patricia-tree": "^1.0.1", "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.1.2", + "merkle-patricia-tree": "^2.3.2", "rustbn.js": "~0.2.0", "safe-buffer": "^5.1.1" }, "dependencies": { - "ethereum-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==", - "dev": true - }, "ethereumjs-block": { - "version": "1.7.1", - "resolved": "http://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.0.tgz", + "integrity": "sha512-Ye+uG/L2wrp364Zihdlr/GfC3ft+zG8PdHcRtsBFNNH1CkOhxOwdB8friBU85n89uRZ9eIMAywCq0F4CwT1wAw==", "dev": true, "requires": { "async": "^2.0.1", - "ethereum-common": "0.2.0", + "ethereumjs-common": "^1.1.0", "ethereumjs-tx": "^1.2.2", "ethereumjs-util": "^5.0.0", "merkle-patricia-tree": "^2.1.2" + }, + "dependencies": { + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "^0.1.3", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + } + } + }, + "ethereumjs-common": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.1.0.tgz", + "integrity": "sha512-LUmYkKV/HcZbWRyu3OU9YOevsH3VJDXtI6kEd8VZweQec+JjDGKCmAVKUyzhYUHqxRJu7JNALZ3A/b3NXOP6tA==", + "dev": true + }, + "ethereumjs-util": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", + "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "0.1.6", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "level-codec": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==", + "dev": true + }, + "level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "dev": true, + "requires": { + "errno": "~0.1.1" + } + }, + "levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "dev": true, + "requires": { + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" + } + }, + "merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", + "dev": true, + "requires": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "^0.1.3", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + } } } } @@ -15310,6 +15715,7 @@ "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", "dev": true, + "optional": true, "requires": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -15319,7 +15725,8 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "dev": true, + "optional": true } } }, @@ -15337,7 +15744,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=", - "dev": true + "dev": true, + "optional": true }, "events": { "version": "3.0.0", @@ -15360,6 +15768,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", "dev": true, + "optional": true, "requires": { "accepts": "~1.3.5", "array-flatten": "1.1.1", @@ -15398,6 +15807,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "optional": true, "requires": { "ms": "2.0.0" } @@ -15406,7 +15816,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "dev": true, + "optional": true } } }, @@ -15478,13 +15889,21 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true, + "optional": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true }, "finalhandler": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, + "optional": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -15500,6 +15919,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "optional": true, "requires": { "ms": "2.0.0" } @@ -15508,7 +15928,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "dev": true, + "optional": true } } }, @@ -15552,25 +15973,29 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true + "dev": true, + "optional": true }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "dev": true, + "optional": true }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "optional": true }, "fs-extra": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0" @@ -15592,13 +16017,494 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "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" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "needle": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", + "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz", + "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", + "requires": { + "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" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", + "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==" + }, + "npm-packlist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.2.0.tgz", + "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "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" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -15626,9 +16532,10 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "dev": true, + "optional": true }, "getpass": { "version": "0.1.7", @@ -15643,6 +16550,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -15673,6 +16581,7 @@ "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", "dev": true, + "optional": true, "requires": { "decompress-response": "^3.2.0", "duplexer3": "^0.1.4", @@ -15693,13 +16602,15 @@ "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true + "dev": true, + "optional": true }, "har-schema": { "version": "2.0.0", @@ -15739,7 +16650,8 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true + "dev": true, + "optional": true }, "has-symbols": { "version": "1.0.0", @@ -15752,6 +16664,7 @@ "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "dev": true, + "optional": true, "requires": { "has-symbol-support-x": "^1.4.1" } @@ -15767,9 +16680,9 @@ } }, "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -15777,9 +16690,9 @@ } }, "hdkey": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.0.tgz", - "integrity": "sha512-E7aU8pNlWUJbXGjTz/+lKf1LkMcA3hUrC5ZleeizrmLSd++kvf8mSOe3q8CmBDA9j4hdfXO5iY6hGiTUCOV2jQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.1.tgz", + "integrity": "sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA==", "dev": true, "optional": true, "requires": { @@ -15823,9 +16736,10 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, + "optional": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -15837,7 +16751,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=", - "dev": true + "dev": true, + "optional": true }, "http-signature": { "version": "1.2.0", @@ -15863,7 +16778,8 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true + "dev": true, + "optional": true }, "immediate": { "version": "3.2.3", @@ -15875,6 +16791,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -15883,7 +16800,8 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "invariant": { "version": "2.2.4", @@ -15904,7 +16822,8 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", - "dev": true + "dev": true, + "optional": true }, "is-arrayish": { "version": "0.2.1", @@ -15912,15 +16831,6 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", @@ -15980,13 +16890,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true + "dev": true, + "optional": true }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true + "dev": true, + "optional": true }, "is-regex": { "version": "1.0.4", @@ -16001,7 +16913,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true + "dev": true, + "optional": true }, "is-stream": { "version": "1.1.0", @@ -16047,15 +16960,16 @@ "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "dev": true, + "optional": true, "requires": { "has-to-string-tag-x": "^1.2.0", "is-object": "^1.0.1" } }, "js-sha3": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", - "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.6.1.tgz", + "integrity": "sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=", "dev": true }, "js-tokens": { @@ -16072,7 +16986,7 @@ }, "jsesc": { "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true }, @@ -16134,14 +17048,15 @@ }, "json5": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, "jsonfile": { "version": "2.4.0", - "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -16177,19 +17092,20 @@ } }, "keccakjs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", - "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.3.tgz", + "integrity": "sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==", "dev": true, "requires": { - "browserify-sha3": "^0.0.1", - "sha3": "^1.1.0" + "browserify-sha3": "^0.0.4", + "sha3": "^1.2.2" } }, "klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, "requires": { "graceful-fs": "^4.1.9" } @@ -16220,7 +17136,7 @@ }, "level-iterator-stream": { "version": "1.3.1", - "resolved": "http://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", "dev": true, "requires": { @@ -16241,7 +17157,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -16311,7 +17227,7 @@ "dependencies": { "readable-stream": { "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { @@ -16378,7 +17294,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -16391,16 +17307,16 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "lodash.assign": { @@ -16428,7 +17344,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "dev": true, + "optional": true }, "lru-cache": { "version": "3.2.0", @@ -16477,9 +17394,10 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "dev": true, + "optional": true }, "memdown": { "version": "1.4.1", @@ -16516,11 +17434,12 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "dev": true, + "optional": true }, "merkle-patricia-tree": { "version": "2.3.1", - "resolved": "http://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.1.tgz", "integrity": "sha512-Qp9Mpb3xazznXzzGQBqHbqCpT2AR9joUOHYYPiQjYCarrdCPCnLWXo4BFv77y4xN26KR224xoU1n/qYY7RYYgw==", "dev": true, "requires": { @@ -16536,7 +17455,7 @@ "dependencies": { "async": { "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, @@ -16576,7 +17495,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "dev": true, + "optional": true }, "miller-rabin": { "version": "4.0.1", @@ -16593,28 +17513,30 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true + "dev": true, + "optional": true }, "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", "dev": true }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, "requires": { - "mime-db": "~1.37.0" + "mime-db": "~1.38.0" } }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true + "dev": true, + "optional": true }, "min-document": { "version": "2.19.0", @@ -16641,19 +17563,20 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -16671,9 +17594,9 @@ } }, "mock-fs": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.7.0.tgz", - "integrity": "sha512-WlQNtUlzMRpvLHf8dqeUmNqfdPjGY29KrJF50Ldb4AcL+vQeR8QH3wQcFMgrhTwb1gHjZn9xggho+84tBskLgA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.8.0.tgz", + "integrity": "sha512-Gwj4KnJOW15YeTJKO5frFd/WDO5Mc0zxXqL9oHx3+e9rBqW8EVARqQHSaIXznUdljrD6pvbNGW2ZGXKPEfYJfw==", "dev": true, "optional": true }, @@ -16704,36 +17627,37 @@ }, "nan": { "version": "2.10.0", - "resolved": "http://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" }, "nano-json-stream-parser": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=", - "dev": true + "dev": true, + "optional": true }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "dev": true, + "optional": true }, "node-fetch": { "version": "2.1.2", - "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=", "dev": true }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } @@ -16749,6 +17673,7 @@ "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", "dev": true, + "optional": true, "requires": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -16758,7 +17683,8 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "dev": true, + "optional": true } } }, @@ -16791,6 +17717,7 @@ "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", "dev": true, + "optional": true, "requires": { "http-https": "^1.0.0" } @@ -16800,6 +17727,7 @@ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, + "optional": true, "requires": { "ee-first": "1.1.1" } @@ -16808,19 +17736,20 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } }, "os-homedir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -16829,7 +17758,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -16837,44 +17766,49 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true + "dev": true, + "optional": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "dev": true, + "optional": true }, "p-timeout": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", "dev": true, + "optional": true, "requires": { "p-finally": "^1.0.0" } }, "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", "dev": true, + "optional": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-headers": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", - "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz", + "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==", "dev": true, "requires": { - "for-each": "^0.3.2", - "trim": "0.0.1" + "for-each": "^0.3.3", + "string.prototype.trim": "^1.1.2" } }, "parse-json": { @@ -16890,7 +17824,8 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true + "dev": true, + "optional": true }, "path-exists": { "version": "2.1.0", @@ -16903,8 +17838,9 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-parse": { "version": "1.0.6", @@ -16916,7 +17852,8 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true + "dev": true, + "optional": true }, "path-type": { "version": "1.1.0", @@ -16931,7 +17868,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -16988,7 +17925,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true + "dev": true, + "optional": true }, "private": { "version": "0.1.8", @@ -17023,6 +17961,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", "dev": true, + "optional": true, "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.8.0" @@ -17041,9 +17980,9 @@ "dev": true }, "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", "dev": true }, "public-encrypt": { @@ -17133,9 +18072,10 @@ }, "query-string": { "version": "5.1.1", - "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, + "optional": true, "requires": { "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", @@ -17143,9 +18083,9 @@ } }, "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -17166,19 +18106,22 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=", - "dev": true + "dev": true, + "optional": true }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true + "dev": true, + "optional": true }, "raw-body": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "dev": true, + "optional": true, "requires": { "bytes": "3.0.0", "http-errors": "1.6.3", @@ -17209,7 +18152,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -17275,7 +18218,7 @@ }, "regjsgen": { "version": "0.2.0", - "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", "dev": true }, @@ -17344,12 +18287,12 @@ "dev": true }, "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, "resumer": { @@ -17362,11 +18305,12 @@ } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "ripemd160": { @@ -17426,9 +18370,9 @@ } }, "scrypt.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", - "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.1.tgz", + "integrity": "sha512-XMoqxwABdotuW+l+qACmJ/h0kVSCgMPZXpbncA/zyBO90z/NnDISzVw+xJ4tUY+X/Hh0EFT269OYHm26VCPgmA==", "dev": true, "optional": true, "requires": { @@ -17447,9 +18391,9 @@ } }, "secp256k1": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.5.2.tgz", - "integrity": "sha512-iin3kojdybY6NArd+UFsoTuapOF7bnJNf2UbcWXaY3z+E1sJDipl60vtzB5hbO/uquBu7z0fd4VC4Irp+xoFVQ==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.6.2.tgz", + "integrity": "sha512-90nYt7yb0LmI4A2jJs1grglkTAXrBwxYAjP9bpeKjvJKOjG2fOeH/YI/lchDMIvjrOasd5QXwvV2jwN168xNng==", "dev": true, "requires": { "bindings": "^1.2.1", @@ -17495,6 +18439,7 @@ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "dev": true, + "optional": true, "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -17516,6 +18461,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "optional": true, "requires": { "ms": "2.0.0" } @@ -17524,7 +18470,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "dev": true, + "optional": true } } }, @@ -17533,6 +18480,7 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, + "optional": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -17545,6 +18493,7 @@ "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", "dev": true, + "optional": true, "requires": { "body-parser": "^1.16.0", "cors": "^2.8.1", @@ -17576,11 +18525,12 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "dev": true, + "optional": true }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -17601,13 +18551,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true + "dev": true, + "optional": true }, "simple-get": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", "dev": true, + "optional": true, "requires": { "decompress-response": "^3.3.0", "once": "^1.3.1", @@ -17620,44 +18572,26 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, - "solc": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.24.tgz", - "integrity": "sha512-2xd7Cf1HeVwrIb6Bu1cwY2/TaLRodrppCq3l7rhLimFQgmxptXhTC3+/wesVLpB09F1A2kZgvbMOgH7wvhFnBQ==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "dev": true, "requires": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - } + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, "spdx-correct": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", - "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -17681,15 +18615,15 @@ } }, "spdx-license-ids": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", - "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "sshpk": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", - "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -17707,7 +18641,8 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "dev": true, + "optional": true }, "stream-to-pull-stream": { "version": "1.7.2", @@ -17731,7 +18666,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true + "dev": true, + "optional": true }, "string-width": { "version": "1.0.2", @@ -17763,7 +18699,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -17827,21 +18763,21 @@ } }, "tape": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/tape/-/tape-4.9.1.tgz", - "integrity": "sha512-6fKIXknLpoe/Jp4rzHKFPpJUHDHDqn8jus99IfPnHIjyz78HYlefTGD3b5EkbQzuLfaEvmfPK3IolLgq2xT3kw==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/tape/-/tape-4.10.1.tgz", + "integrity": "sha512-G0DywYV1jQeY3axeYnXUOt6ktnxS9OPJh97FGR3nrua8lhWi1zPflLxcAHavZ7Jf3qUfY7cxcVIVFa4mY2IY1w==", "dev": true, "requires": { "deep-equal": "~1.0.1", "defined": "~1.0.0", "for-each": "~0.3.3", "function-bind": "~1.1.1", - "glob": "~7.1.2", + "glob": "~7.1.3", "has": "~1.0.3", "inherits": "~2.0.3", "minimist": "~1.2.0", "object-inspect": "~1.6.0", - "resolve": "~1.7.1", + "resolve": "~1.10.0", "resumer": "~0.0.0", "string.prototype.trim": "~1.1.2", "through": "~2.3.8" @@ -17849,7 +18785,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -17857,7 +18793,7 @@ }, "tar": { "version": "2.2.1", - "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "optional": true, @@ -17872,6 +18808,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dev": true, + "optional": true, "requires": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -17898,7 +18835,7 @@ "dependencies": { "bluebird": { "version": "2.11.0", - "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", "dev": true, "optional": true @@ -17910,6 +18847,7 @@ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", "dev": true, + "optional": true, "requires": { "any-promise": "^1.0.0" } @@ -17919,13 +18857,14 @@ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", "dev": true, + "optional": true, "requires": { "thenify": ">= 3.1.0 < 4" } }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -17943,7 +18882,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true + "dev": true, + "optional": true }, "tmp": { "version": "0.0.33", @@ -17958,7 +18898,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true + "dev": true, + "optional": true }, "to-fast-properties": { "version": "1.0.3", @@ -17990,12 +18931,6 @@ "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", "dev": true }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true - }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -18022,6 +18957,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "dev": true, + "optional": true, "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.18" @@ -18067,64 +19003,39 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true + "dev": true, + "optional": true }, "unbzip2-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz", - "integrity": "sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", + "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", "dev": true, "optional": true, "requires": { - "buffer": "^3.0.1", - "through": "^2.3.6" - }, - "dependencies": { - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", - "dev": true, - "optional": true - }, - "buffer": { - "version": "3.6.0", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "dev": true, - "optional": true, - "requires": { - "base64-js": "0.0.8", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - } + "buffer": "^5.2.1", + "through": "^2.3.8" } }, "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "dev": true, + "optional": true }, "unorm": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", - "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.5.0.tgz", + "integrity": "sha512-sMfSWoiRaXXeDZSXC+YRZ23H4xchQpwxjpw1tmfR+kgbBCaOgln4NI0LXejJIhnBuKINrB3WRn+ZI8IWssirVw==", "dev": true }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "dev": true, + "optional": true }, "uri-js": { "version": "4.2.2", @@ -18140,6 +19051,7 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, + "optional": true, "requires": { "prepend-http": "^1.0.1" } @@ -18148,13 +19060,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=", - "dev": true + "dev": true, + "optional": true }, "url-to-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true + "dev": true, + "optional": true }, "utf8": { "version": "3.0.0", @@ -18173,7 +19087,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "dev": true, + "optional": true }, "uuid": { "version": "3.3.2", @@ -18195,7 +19110,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "dev": true, + "optional": true }, "verror": { "version": "1.10.0", @@ -18241,6 +19157,7 @@ "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.35.tgz", "integrity": "sha512-ayGavbgVk4KL9Y88Uv411fBJ0SVgVfKhKEBweKYzmP0zOqneMzWt6YsyD1n6kRvjAbqA0AfUPEOKyMNjcx2tjw==", "dev": true, + "optional": true, "requires": { "web3-core-helpers": "1.0.0-beta.35", "web3-core-method": "1.0.0-beta.35", @@ -18253,6 +19170,7 @@ "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.35.tgz", "integrity": "sha512-APOu3sEsamyqWt//8o4yq9KF25/uqGm+pQShson/sC4gKzmfJB07fLo2ond0X30E8fIqAPeVCotPXQxGciGUmA==", "dev": true, + "optional": true, "requires": { "underscore": "1.8.3", "web3-eth-iban": "1.0.0-beta.35", @@ -18264,6 +19182,7 @@ "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.35.tgz", "integrity": "sha512-jidImCide8q0GpfsO4L73qoHrbkeWgwU3uOH5DKtJtv0ccmG086knNMRgryb/o9ZgetDWLmDEsJnHjBSoIwcbA==", "dev": true, + "optional": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.35", @@ -18277,6 +19196,7 @@ "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.35.tgz", "integrity": "sha512-GvqXqKq07OmHuVi5uNRg6k79a1/CI0ViCC+EtNv4CORHtDRmYEt5Bvdv6z6FJEiaaQkD0lKbFwNhLxutx7HItw==", "dev": true, + "optional": true, "requires": { "any-promise": "1.3.0", "eventemitter3": "1.1.1" @@ -18287,6 +19207,7 @@ "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.35.tgz", "integrity": "sha512-S+zW2h17ZZQU9oe3yaCJE0E7aJS4C3Kf4kGPDv+nXjW0gKhQQhgVhw1Doq/aYQGqNSWJp7f1VHkz5gQWwg6RRg==", "dev": true, + "optional": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.35", @@ -18300,6 +19221,7 @@ "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.35.tgz", "integrity": "sha512-gXzLrWvcGkGiWq1y33Z4Y80XI8XMrwowiQJkrPSjQ81K5PBKquOGwcMffLaKcwdmEy/NpsOXDeFo3eLE1Ghvvw==", "dev": true, + "optional": true, "requires": { "eventemitter3": "1.1.1", "underscore": "1.8.3", @@ -18332,6 +19254,7 @@ "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.35.tgz", "integrity": "sha512-KUDC+EtFFYG8z01ZleKrASdjj327/rtWHzEt6RWsEj7bBa0bGp9nEh+nqdZx/Sdgz1O8tnfFzJlrRcXpfr1vGg==", "dev": true, + "optional": true, "requires": { "bn.js": "4.11.6", "underscore": "1.8.3", @@ -18343,7 +19266,8 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "dev": true, + "optional": true } } }, @@ -18378,9 +19302,20 @@ "xhr-request-promise": "^0.1.2" } }, + "scrypt.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", + "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", + "dev": true, + "optional": true, + "requires": { + "scrypt": "^6.0.2", + "scryptsy": "^1.2.1" + } + }, "uuid": { "version": "2.0.1", - "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", "dev": true, "optional": true @@ -18409,6 +19344,7 @@ "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.35.tgz", "integrity": "sha512-H5wkcNcAIc+h/WoDIKv7ZYmrM2Xqu3O7jBQl1IWo73EDVQji+AoB2i3J8tuwI1yZRInRwrfpI3Zuwuf54hXHmQ==", "dev": true, + "optional": true, "requires": { "bn.js": "4.11.6", "web3-utils": "1.0.0-beta.35" @@ -18418,7 +19354,8 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "dev": true, + "optional": true } } }, @@ -18427,6 +19364,7 @@ "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.35.tgz", "integrity": "sha512-AcM9nnlxu7ZRRxPvkrFB9eLxMM4A2cPfj2aCg21Wb2EpMnhR+b/O1cT33k7ApRowoMpM+T9M8vx2oPNwXfaCOQ==", "dev": true, + "optional": true, "requires": { "web3-core": "1.0.0-beta.35", "web3-core-helpers": "1.0.0-beta.35", @@ -18440,6 +19378,7 @@ "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.35.tgz", "integrity": "sha512-bbwaQ/KohGjIJ6HAKbZ6KrklCAaG6/B7hIbAbVLSFLxF+Yz9lmAgQYaDInpidpC/NLb3WOmcbRF+P77J4qMVIA==", "dev": true, + "optional": true, "requires": { "web3-core": "1.0.0-beta.35", "web3-core-method": "1.0.0-beta.35", @@ -18480,17 +19419,36 @@ "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", "dev": true, "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "ethereumjs-util": "^5.1.1" } }, + "ethereum-common": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", + "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==", + "dev": true + }, "ethereumjs-abi": { "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "dev": true, "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + }, + "ethereumjs-block": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", + "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", + "dev": true, + "requires": { + "async": "^2.0.1", + "ethereum-common": "0.2.0", + "ethereumjs-tx": "^1.2.2", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" } }, "ws": { @@ -18509,6 +19467,7 @@ "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.35.tgz", "integrity": "sha512-DcIMFq52Fb08UpWyZ3ZlES6NsNqJnco4hBS/Ej6eOcASfuUayPI+GLkYVZsnF3cBYqlH+DOKuArcKSuIxK7jIA==", "dev": true, + "optional": true, "requires": { "web3-core-helpers": "1.0.0-beta.35", "xhr2-cookies": "1.1.0" @@ -18519,6 +19478,7 @@ "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.35.tgz", "integrity": "sha512-iB0FG0HcpUnayfa8pn4guqEQ4Y1nrroi/jffdtQgFkrNt0sD3fMSwwC0AbmECqj3tDLl0e1slBR0RENll+ZF0g==", "dev": true, + "optional": true, "requires": { "oboe": "2.1.3", "underscore": "1.8.3", @@ -18530,10 +19490,11 @@ "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.35.tgz", "integrity": "sha512-Cx64NgDStynKaUGDIIOfaCd0fZusL8h5avKTkdTjUu2aHhFJhZoVBGVLhoDtUaqZGWIZGcBJOoVf2JkGUOjDRQ==", "dev": true, + "optional": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.35", - "websocket": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" + "websocket": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible" }, "dependencies": { "debug": { @@ -18541,6 +19502,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "optional": true, "requires": { "ms": "2.0.0" } @@ -18549,6 +19511,7 @@ "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", "dev": true, + "optional": true, "requires": { "debug": "^2.2.0", "nan": "^2.3.3", @@ -18576,6 +19539,7 @@ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.35.tgz", "integrity": "sha512-Dq6f0SOKj3BDFRgOPnE6ALbzBDCKVIW8mKWVf7tGVhTDHf+wQaWwQSC3aArFSqdExB75BPBPyDpuMTNszhljpA==", "dev": true, + "optional": true, "requires": { "bn.js": "4.11.6", "eth-lib": "0.1.27", @@ -18590,13 +19554,15 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "dev": true, + "optional": true }, "utf8": { "version": "2.1.1", - "resolved": "http://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=", - "dev": true + "dev": true, + "optional": true } } }, @@ -18625,7 +19591,7 @@ }, "whatwg-fetch": { "version": "2.0.4", - "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", "dev": true }, @@ -18643,7 +19609,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -18654,13 +19620,15 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "ws": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dev": true, + "optional": true, "requires": { "async-limiter": "~1.0.0", "safe-buffer": "~5.1.0", @@ -18684,6 +19652,7 @@ "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", "dev": true, + "optional": true, "requires": { "buffer-to-arraybuffer": "^0.0.5", "object-assign": "^4.1.1", @@ -18699,6 +19668,7 @@ "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", "dev": true, + "optional": true, "requires": { "xhr-request": "^1.0.1" } @@ -18708,6 +19678,7 @@ "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", "dev": true, + "optional": true, "requires": { "cookiejar": "^2.1.1" } @@ -18732,7 +19703,7 @@ }, "yargs": { "version": "4.8.1", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "dev": true, "requires": { @@ -18754,7 +19725,7 @@ }, "yargs-parser": { "version": "2.4.1", - "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", "dev": true, "requires": { @@ -21646,6 +22617,12 @@ } } }, + "human-standard-collectible-abi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/human-standard-collectible-abi/-/human-standard-collectible-abi-1.0.2.tgz", + "integrity": "sha512-nD3ITUuSAIBgkaCm9J2BGwlHL8iEzFjJfTleDAC5Wi8RBJEXXhxV0JeJjd95o+rTwf98uTE5MW+VoBKOIYQh0g==", + "dev": true + }, "human-standard-token-abi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/human-standard-token-abi/-/human-standard-token-abi-2.0.0.tgz", @@ -21739,37 +22716,6 @@ "postcss": "^6.0.1" } }, - "idb-global": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/idb-global/-/idb-global-2.1.0.tgz", - "integrity": "sha512-tJPsvisI6A1xQ6y+orXavjgm/7O6v0YT4wKfw8rwv635pIhsc1Wi2ZhcS+6nYmpyyeaTBC/xG0MWcD9iwCD3xg==", - "requires": { - "obs-store": "^2.4.1" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "obs-store": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/obs-store/-/obs-store-2.4.1.tgz", - "integrity": "sha512-wpA8G4uSn8cnCKZ0pFTvqsamvy0Sm1hR2ot0Qonbfj5yBMwdAp/eD4vDI+U/ZCbV1hb2V5GapL8YKUdGCvahgg==", - "requires": { - "babel-preset-es2015": "^6.22.0", - "babelify": "^7.3.0", - "readable-stream": "^2.2.2", - "through2": "^2.0.3", - "xtend": "^4.0.1" - } - } - } - }, "identicon.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/identicon.js/-/identicon.js-2.3.1.tgz", @@ -21816,19 +22762,6 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, - "iframe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/iframe/-/iframe-1.0.0.tgz", - "integrity": "sha1-WOdIIrF4oFedCc0WlkD7lTdHDvU=" - }, - "iframe-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/iframe-stream/-/iframe-stream-3.0.0.tgz", - "integrity": "sha1-Aw2JE6mL7uuxD472feAJvCuSZtY=", - "requires": { - "post-message-stream": "^3.0.0" - } - }, "ignore": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", @@ -22147,7 +23080,8 @@ "ipaddr.js": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=", + "dev": true }, "irregular-plurals": { "version": "1.4.0", @@ -23142,7 +24076,7 @@ "dependencies": { "babelify": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", "requires": { "babel-core": "^6.0.14", @@ -23181,7 +24115,7 @@ }, "babelify": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", "requires": { "babel-core": "^6.0.14", @@ -25444,7 +26378,8 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true }, "mem": { "version": "1.1.0", @@ -25529,7 +26464,8 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true }, "merge-source-map": { "version": "1.0.4", @@ -25589,161 +26525,6 @@ "resolved": "https://registry.npmjs.org/mersenne-twister/-/mersenne-twister-1.1.0.tgz", "integrity": "sha1-+RZhjuQ9cXnvz2Qb7EUx65Zwl4o=" }, - "metamascara": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/metamascara/-/metamascara-2.2.1.tgz", - "integrity": "sha512-3DmfdacKzZxeFpCNKCw1z3ITHLJHgFLGqh7fWgrVeRPq8Ni6qi1SYMBn0xspkEwzZAxiMohYDaZ/EEnNenuDqA==", - "requires": { - "iframe": "^1.0.0", - "iframe-stream": "^3.0.0", - "json-rpc-engine": "^3.1.0", - "json-rpc-middleware-stream": "^1.0.0", - "obj-multiplex": "^1.0.0", - "obs-store": "^2.4.1", - "pump": "^1.0.2" - }, - "dependencies": { - "async-eventemitter": { - "version": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "from": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "requires": { - "async": "^2.4.0" - } - }, - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "eth-block-tracker": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-2.3.1.tgz", - "integrity": "sha512-NamWuMBIl8kmkJFVj8WzGatySTzQPQag4Xr677yFxdVtIxACFbL/dQowk0MzEqIKk93U1TwY3MjVU6mOcwZnKA==", - "requires": { - "async-eventemitter": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" - } - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "ethjs-format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ethjs-format/-/ethjs-format-0.2.2.tgz", - "integrity": "sha1-1zs6YFwuElcHn3B3/VRI6ZjOD80=", - "requires": { - "bn.js": "4.11.6", - "ethjs-schema": "0.1.5", - "ethjs-util": "0.1.3", - "is-hex-prefixed": "1.0.0", - "number-to-bn": "1.7.0", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "ethjs-util": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", - "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - } - } - }, - "ethjs-query": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.2.9.tgz", - "integrity": "sha1-om5rTzhpnpLzSyGE51x4lDKcQvE=", - "requires": { - "ethjs-format": "0.2.2", - "ethjs-rpc": "0.1.5" - } - }, - "ethjs-schema": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/ethjs-schema/-/ethjs-schema-0.1.5.tgz", - "integrity": "sha1-WXQOOzl3vNu5sRvDBoIB6Kzquw0=" - }, - "json-rpc-engine": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.7.3.tgz", - "integrity": "sha512-+FO3UWu/wafh/+MZ6BXy0HZU+f5plwUn82FgxpC0scJkEh5snOjFrAAtqCITPDfvfLHRUFOG5pQDUx2pspfERQ==", - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.3.2", - "babelify": "^7.3.0", - "clone": "^2.1.1", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0" - } - }, - "json-rpc-middleware-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-middleware-stream/-/json-rpc-middleware-stream-1.0.1.tgz", - "integrity": "sha512-IR6cOO6B21NdLpiYblueB3O+g3UAYLIZd6ZgZfddVPl0z6vSECcpuiYnV5MmIMJY3D0fLYpJqOxYaEmLYQqTtA==", - "requires": { - "end-of-stream": "^1.4.0", - "eth-block-tracker": "^2.1.2", - "ethjs-query": "^0.2.9", - "json-rpc-engine": "^3.0.1", - "readable-stream": "^2.3.3" - } - }, - "obs-store": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/obs-store/-/obs-store-2.4.1.tgz", - "integrity": "sha512-wpA8G4uSn8cnCKZ0pFTvqsamvy0Sm1hR2ot0Qonbfj5yBMwdAp/eD4vDI+U/ZCbV1hb2V5GapL8YKUdGCvahgg==", - "requires": { - "babel-preset-es2015": "^6.22.0", - "babelify": "^7.3.0", - "readable-stream": "^2.2.2", - "through2": "^2.0.3", - "xtend": "^4.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "metamask-inpage-provider": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/metamask-inpage-provider/-/metamask-inpage-provider-1.3.0.tgz", @@ -25760,7 +26541,7 @@ "dependencies": { "babelify": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", "requires": { "babel-core": "^6.0.14", @@ -26410,7 +27191,8 @@ "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true }, "neo-async": { "version": "2.5.0", @@ -26685,7 +27467,8 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true }, "tar": { "version": "4.4.6", @@ -26705,7 +27488,8 @@ "yallist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "optional": true } } }, @@ -26952,6 +27736,7 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -27330,7 +28115,8 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "dev": true, + "optional": true }, "is-builtin-module": { "version": "1.0.0", @@ -27426,6 +28212,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, + "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -27468,7 +28255,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "dev": true, + "optional": true }, "lru-cache": { "version": "4.1.3", @@ -27698,7 +28486,8 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "dev": true, + "optional": true }, "require-directory": { "version": "2.1.1", @@ -28456,16 +29245,11 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, "requires": { "ee-first": "1.1.1" } }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -28827,7 +29611,8 @@ "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true }, "pascalcase": { "version": "0.1.1", @@ -28918,7 +29703,8 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true }, "path-type": { "version": "1.1.0", @@ -30948,6 +31734,12 @@ } } }, + "precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", + "dev": true + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -31145,6 +31937,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "dev": true, "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.5.2" @@ -31584,7 +32377,8 @@ "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true }, "raphael": { "version": "2.2.7", @@ -33449,6 +34243,7 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "dev": true, "requires": { "debug": "2.6.9", "depd": "~1.1.1", @@ -33496,6 +34291,7 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "dev": true, "requires": { "encodeurl": "~1.0.1", "escape-html": "~1.0.3", @@ -33533,7 +34329,8 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true }, "sha.js": { "version": "2.4.9", @@ -36172,61 +36969,6 @@ } } }, - "sw-controller": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sw-controller/-/sw-controller-1.0.3.tgz", - "integrity": "sha512-q+rS4v7kj1MPDxFRyl8GAICw/BbQzewd5HhVDNIPLnyvKtcpxi26fVXReUeUMRl4CRL/fX56PvKKqxtKhAaMpg==", - "requires": { - "babel-preset-es2015": "^6.22.0", - "babel-runtime": "^6.23.0", - "babelify": "^7.3.0" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - } - } - }, - "sw-stream": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sw-stream/-/sw-stream-2.0.2.tgz", - "integrity": "sha512-V/aer72LYQ0Cn1y4O0xOGz794l7ccqlqpwgqO04Dm9yYb8pwR484FV+TS6G+cXhUZ6vnZ+CnX6g2uoDzpHZgFQ==", - "requires": { - "babel-preset-es2015": "^6.22.0", - "babel-runtime": "^6.23.0", - "babelify": "^7.3.0", - "end-of-stream": "^1.1.0", - "pump": "^1.0.2", - "readable-stream": "^2.2.2", - "through2": "^2.0.3" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "swappable-obj-proxy": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/swappable-obj-proxy/-/swappable-obj-proxy-1.1.0.tgz", @@ -37078,6 +37820,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, + "tweetnacl-util": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.0.tgz", + "integrity": "sha1-RXbBzuXi1j0gf+5S8boCgZSAvHU=", + "dev": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -37096,6 +37844,7 @@ "version": "1.6.15", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.15" @@ -37750,7 +38499,8 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true }, "uuid": { "version": "2.0.3", @@ -37799,7 +38549,8 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true }, "velocity-animate": { "version": "1.5.1", @@ -38107,7 +38858,7 @@ "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.3.tgz", "integrity": "sha1-yqRDc9yIFayHZ73ba6cwc5ZMqos=", "requires": { - "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", + "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git", "crypto-js": "^3.1.4", "utf8": "^2.1.1", "xhr2": "*", @@ -38120,6 +38871,264 @@ } } }, + "web3-provider-engine": { + "version": "github:metamask/provider-engine#e91367bc2c2535fbf7add06244d9d4ec98620042", + "from": "github:metamask/provider-engine#e91367bc2c2535fbf7add06244d9d4ec98620042", + "dev": true, + "requires": { + "async": "^2.5.0", + "backoff": "^2.5.0", + "clone": "^2.0.0", + "cross-fetch": "^2.1.0", + "eth-block-tracker": "^3.0.0", + "eth-json-rpc-infura": "^3.1.0", + "eth-sig-util": "^1.4.2", + "ethereumjs-block": "^1.2.2", + "ethereumjs-tx": "^1.2.0", + "ethereumjs-util": "^5.1.5", + "ethereumjs-vm": "^2.3.4", + "json-rpc-error": "^2.0.0", + "json-stable-stringify": "^1.0.1", + "promise-to-callback": "^1.0.0", + "readable-stream": "^2.2.9", + "request": "^2.85.0", + "semaphore": "^1.0.3", + "ws": "^5.1.1", + "xhr": "^2.2.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "babelify": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", + "dev": true, + "requires": { + "babel-core": "^6.0.14", + "object-assign": "^4.0.0" + } + }, + "eth-block-tracker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz", + "integrity": "sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==", + "dev": true, + "requires": { + "eth-query": "^2.1.0", + "ethereumjs-tx": "^1.3.3", + "ethereumjs-util": "^5.1.3", + "ethjs-util": "^0.1.3", + "json-rpc-engine": "^3.6.0", + "pify": "^2.3.0", + "tape": "^4.6.3" + } + }, + "eth-sig-util": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", + "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", + "dev": true, + "requires": { + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "ethereumjs-util": "^5.1.1" + } + }, + "ethereumjs-abi": { + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#572d4bafe08a8a231137e1f9daeb0f8a23f197d2", + "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "dev": true, + "requires": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + }, + "dependencies": { + "ethereumjs-util": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", + "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "0.1.6", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + } + } + }, + "ethereumjs-common": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.1.0.tgz", + "integrity": "sha512-LUmYkKV/HcZbWRyu3OU9YOevsH3VJDXtI6kEd8VZweQec+JjDGKCmAVKUyzhYUHqxRJu7JNALZ3A/b3NXOP6tA==", + "dev": true + }, + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "^0.1.3", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "ethereumjs-vm": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", + "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", + "dev": true, + "requires": { + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "ethereumjs-account": "^2.0.3", + "ethereumjs-block": "~2.2.0", + "ethereumjs-common": "^1.1.0", + "ethereumjs-util": "^6.0.0", + "fake-merkle-patricia-tree": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "ethereumjs-block": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.0.tgz", + "integrity": "sha512-Ye+uG/L2wrp364Zihdlr/GfC3ft+zG8PdHcRtsBFNNH1CkOhxOwdB8friBU85n89uRZ9eIMAywCq0F4CwT1wAw==", + "dev": true, + "requires": { + "async": "^2.0.1", + "ethereumjs-common": "^1.1.0", + "ethereumjs-tx": "^1.2.2", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" + }, + "dependencies": { + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "^0.1.3", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + } + } + }, + "ethereumjs-util": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", + "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", + "dev": true, + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "0.1.6", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + }, + "dependencies": { + "ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + } + } + } + } + }, + "json-rpc-engine": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", + "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", + "dev": true, + "requires": { + "async": "^2.0.1", + "babel-preset-env": "^1.7.0", + "babelify": "^7.3.0", + "json-rpc-error": "^2.0.0", + "promise-to-callback": "^1.0.0", + "safe-event-emitter": "^1.0.1" + } + }, + "merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", + "dev": true, + "requires": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", + "dev": true + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, "web3-stream-provider": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/web3-stream-provider/-/web3-stream-provider-3.0.1.tgz", @@ -38539,6 +39548,15 @@ "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.3.tgz", "integrity": "sha1-y/xHWaabSoiOeM9PILBRA4dXvRE=" }, + "xhr2-cookies": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", + "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", + "dev": true, + "requires": { + "cookiejar": "^2.1.1" + } + }, "xml-name-validator": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", diff --git a/package.json b/package.json index e2f6ff0d1560..873d53222c33 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "private": true, "scripts": { "start": "gulp dev:extension", - "mascara": "gulp dev:mascara & node ./mascara/example/server", "dist": "gulp dist", "doc": "jsdoc -c development/tools/.jsdoc.json", "publish-docs": "gh-pages -d docs/jsdocs", @@ -12,7 +11,7 @@ "watch:test:unit": "nodemon --exec \"npm run test:unit\" ./test ./app ./ui", "test:unit": "cross-env METAMASK_ENV=test mocha --exit --require test/setup.js --recursive \"test/unit/**/*.js\" \"ui/app/**/*.test.js\"", "test:single": "cross-env METAMASK_ENV=test mocha --require test/helper.js", - "test:integration": "npm run test:integration:build && npm run test:flat && npm run test:mascara", + "test:integration": "npm run test:integration:build && npm run test:flat", "test:integration:build": "gulp build:scss", "test:e2e:drizzle:beta": "SELENIUM_BROWSER=chrome test/e2e/beta/run-drizzle.sh", "test:e2e:chrome": "SELENIUM_BROWSER=chrome test/e2e/beta/run-all.sh", @@ -27,12 +26,6 @@ "test:flat:build:states": "node development/genStates.js", "test:flat:build:locales": "mkdirp dist/chrome && cp -R app/_locales dist/chrome/_locales", "test:flat:build:ui": "npm run test:flat:build:states && browserify ./development/mock-dev.js -o ./development/bundle.js", - "test:mascara": "npm run test:mascara:build && karma start test/mascara.conf.js", - "test:mascara:build": "mkdirp dist/mascara && npm run test:mascara:build:ui && npm run test:mascara:build:background && npm run test:mascara:build:tests && npm run test:mascara:build:locales", - "test:mascara:build:ui": "browserify mascara/test/test-ui.js -o dist/mascara/ui.js", - "test:mascara:build:locales": "mkdirp dist/chrome && cp -R app/_locales dist/chrome/_locales", - "test:mascara:build:background": "browserify mascara/src/background.js -o dist/mascara/background.js", - "test:mascara:build:tests": "browserify test/integration/lib/first-time.js -o dist/mascara/tests.js", "ganache:start": "ganache-cli --noVMErrorsOnRPCResponse -i 5777 -m 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent'", "sentry:publish": "node ./development/sentry-publish.js", "lint": "eslint .", @@ -43,33 +36,12 @@ "announce": "node development/announcer.js", "version:bump": "node development/run-version-bump.js", "storybook": "start-storybook -p 6006 -c .storybook", - "update-changelog": "./auto-changelog.sh" + "update-changelog": "./development/auto-changelog.sh", + "rollback": "./development/rollback.sh" }, "browserify": { "transform": [ - [ - "babelify", - { - "presets": [ - [ - "env", - { - "browsers": [ - ">0.25%", - "not ie 11", - "not op_mini all" - ] - } - ], - "stage-0" - ] - }, - { - "plugins": [ - "transform-class-properties" - ] - } - ], + "babelify", "reactify", "brfs" ] @@ -130,7 +102,6 @@ "ethjs-contract": "^0.2.3", "ethjs-ens": "^2.0.0", "ethjs-query": "^0.3.4", - "express": "^4.15.5", "extension-link-enabler": "^1.0.0", "extension-port-stream": "^1.0.0", "extensionizer": "^1.0.1", @@ -139,10 +110,7 @@ "fuse.js": "^3.2.0", "hat": "0.0.3", "human-standard-token-abi": "^2.0.0", - "idb-global": "^2.1.0", "identicon.js": "^2.3.1", - "iframe": "^1.0.0", - "iframe-stream": "^3.0.0", "inject-css": "^0.1.1", "jazzicon": "^1.2.0", "json-rpc-engine": "^4.0.0", @@ -154,7 +122,6 @@ "lodash.uniqby": "^4.7.0", "loglevel": "^1.4.1", "luxon": "^1.8.2", - "metamascara": "^2.0.0", "metamask-inpage-provider": "^1.3.0", "metamask-logo": "^2.1.4", "mkdirp": "^0.5.1", @@ -207,8 +174,6 @@ "semver": "^5.4.1", "shallow-copy": "0.0.1", "single-call-balance-checker-abi": "^1.0.0", - "sw-controller": "^1.0.3", - "sw-stream": "^2.0.2", "swappable-obj-proxy": "^1.1.0", "textarea-caret": "^3.0.1", "valid-url": "^1.0.9", @@ -238,7 +203,6 @@ "chai": "^4.1.0", "chromedriver": "^2.41.0", "clipboardy": "^1.2.3", - "compression": "^1.7.1", "coveralls": "^3.0.0", "cross-env": "^5.1.4", "css-loader": "^0.28.11", @@ -256,8 +220,9 @@ "file-loader": "^1.1.11", "fs-extra": "^6.0.1", "fs-promise": "^2.0.3", + "gaba": "1.0.0-beta.65", "ganache-cli": "^6.1.0", - "ganache-core": "^2.3.1", + "ganache-core": "^2.5.3", "geckodriver": "^1.14.1", "gh-pages": "^1.2.0", "gifencoder": "^1.1.0", diff --git a/test/e2e/beta/metamask-beta-ui.spec.js b/test/e2e/beta/metamask-beta-ui.spec.js index 06f67ad95400..2700d16561fb 100644 --- a/test/e2e/beta/metamask-beta-ui.spec.js +++ b/test/e2e/beta/metamask-beta-ui.spec.js @@ -233,7 +233,11 @@ describe('MetaMask', function () { await customRpcButton.click() await delay(regularDelayMs) - const privacyToggle = await findElement(driver, By.css('.settings-page__content-row:nth-of-type(10) .settings-page__content-item-col > div')) + const securityTab = await findElement(driver, By.xpath(`//div[contains(text(), 'Security & Privacy')]`)) + await securityTab.click() + await delay(regularDelayMs) + + const privacyToggle = await findElement(driver, By.css('.settings-page__content-row:nth-of-type(1) .settings-page__content-item-col > div')) await privacyToggle.click() await delay(largeDelayMs * 2) }) @@ -472,15 +476,19 @@ describe('MetaMask', function () { const settingsButton = await findElement(driver, By.xpath(`//div[contains(text(), 'Settings')]`)) settingsButton.click() - await findElement(driver, By.css('.tab-bar')) + // await findElement(driver, By.css('.tab-bar')) + + const advancedTab = await findElement(driver, By.xpath(`//div[contains(text(), 'Advanced')]`)) + await advancedTab.click() + await delay(regularDelayMs) - const showConversionToggle = await findElement(driver, By.css('.settings-page__content-row:nth-of-type(3) .settings-page__content-item-col > div')) + const showConversionToggle = await findElement(driver, By.css('.settings-page__content-row:nth-of-type(7) .settings-page__content-item-col > div')) await showConversionToggle.click() const advancedGasTitle = await findElement(driver, By.xpath(`//span[contains(text(), 'Advanced gas controls')]`)) await driver.executeScript('arguments[0].scrollIntoView(true)', advancedGasTitle) - const advancedGasToggle = await findElement(driver, By.css('.settings-page__content-row:nth-of-type(12) .settings-page__content-item-col > div')) + const advancedGasToggle = await findElement(driver, By.css('.settings-page__content-row:nth-of-type(5) .settings-page__content-item-col > div')) await advancedGasToggle.click() windowHandles = await driver.getAllWindowHandles() extension = windowHandles[0] @@ -1053,7 +1061,6 @@ describe('MetaMask', function () { const windowHandles = await driver.getAllWindowHandles() const extension = windowHandles[0] const dapp = await switchToWindowWithTitle(driver, 'E2E Test Dapp', windowHandles) - await closeAllWindowHandlesExcept(driver, [extension, dapp]) await delay(regularDelayMs) await driver.switchTo().window(dapp) @@ -1062,7 +1069,6 @@ describe('MetaMask', function () { const transferTokens = await findElement(driver, By.xpath(`//button[contains(text(), 'Transfer Tokens')]`)) await transferTokens.click() - await closeAllWindowHandlesExcept(driver, [extension, dapp]) await driver.switchTo().window(extension) await delay(largeDelayMs) diff --git a/test/mascara.conf.js b/test/mascara.conf.js deleted file mode 100644 index faf3147bd6f3..000000000000 --- a/test/mascara.conf.js +++ /dev/null @@ -1,17 +0,0 @@ -const getBaseConfig = require('./base.conf.js') - -module.exports = function (config) { - const settings = getBaseConfig(config) - - // ui and tests - settings.files.push('dist/mascara/ui.js') - settings.files.push('dist/mascara/tests.js') - // service worker background - settings.files.push({ pattern: 'dist/mascara/background.js', watched: false, included: false, served: true }) - settings.proxies['/background.js'] = '/base/dist/mascara/background.js' - - // use this to keep the browser open for debugging - settings.browserNoActivityTimeout = 10000000 - - config.set(settings) -} diff --git a/test/unit/actions/config_test.js b/test/unit/actions/config_test.js index 648f456fb2f7..9127474a8b1c 100644 --- a/test/unit/actions/config_test.js +++ b/test/unit/actions/config_test.js @@ -3,8 +3,8 @@ var assert = require('assert') var freeze = require('deep-freeze-strict') var path = require('path') -var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) -var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) +var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'store', 'actions.js')) +var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'ducks', 'index.js')) describe('config view actions', function () { var initialState = { diff --git a/test/unit/actions/set_account_label_test.js b/test/unit/actions/set_account_label_test.js index 53ea1d130e01..1601d638306f 100644 --- a/test/unit/actions/set_account_label_test.js +++ b/test/unit/actions/set_account_label_test.js @@ -2,8 +2,8 @@ const assert = require('assert') const freeze = require('deep-freeze-strict') const path = require('path') -const actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) -const reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) +const actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'store', 'actions.js')) +const reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'ducks', 'index.js')) describe('SET_ACCOUNT_LABEL', function () { it('updates the state.metamask.identities[:i].name property of the state to the action.value.label', function () { diff --git a/test/unit/actions/set_selected_account_test.js b/test/unit/actions/set_selected_account_test.js index 28b47d09dd34..36d312d7bbeb 100644 --- a/test/unit/actions/set_selected_account_test.js +++ b/test/unit/actions/set_selected_account_test.js @@ -3,8 +3,8 @@ var assert = require('assert') var freeze = require('deep-freeze-strict') var path = require('path') -var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) -var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) +var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'store', 'actions.js')) +var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'ducks', 'index.js')) describe('SET_SELECTED_ACCOUNT', function () { it('sets the state.appState.activeAddress property of the state to the action.value', function () { diff --git a/test/unit/actions/tx_test.js b/test/unit/actions/tx_test.js index 160cd45526df..8c64d844fd66 100644 --- a/test/unit/actions/tx_test.js +++ b/test/unit/actions/tx_test.js @@ -4,7 +4,7 @@ var path = require('path') import configureMockStore from 'redux-mock-store' import thunk from 'redux-thunk' -const actions = require(path.join(__dirname, '../../../ui/app/actions.js')) +const actions = require(path.join(__dirname, '../../../ui/app/store/actions.js')) const middlewares = [thunk] const mockStore = configureMockStore(middlewares) diff --git a/test/unit/actions/view_info_test.js b/test/unit/actions/view_info_test.js index 69895d8017e7..5785a368c4bb 100644 --- a/test/unit/actions/view_info_test.js +++ b/test/unit/actions/view_info_test.js @@ -3,8 +3,8 @@ var assert = require('assert') var freeze = require('deep-freeze-strict') var path = require('path') -var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) -var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) +var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'store', 'actions.js')) +var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'ducks', 'index.js')) describe('SHOW_INFO_PAGE', function () { it('sets the state.appState.currentView.name property to info', function () { diff --git a/test/unit/actions/warning_test.js b/test/unit/actions/warning_test.js index 28b565499e9b..e57374cda5d3 100644 --- a/test/unit/actions/warning_test.js +++ b/test/unit/actions/warning_test.js @@ -3,8 +3,8 @@ var assert = require('assert') var freeze = require('deep-freeze-strict') var path = require('path') -var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) -var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) +var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'store', 'actions.js')) +var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'ducks', 'index.js')) describe('action DISPLAY_WARNING', function () { it('sets appState.warning to provided value', function () { diff --git a/test/unit/app/buy-eth-url.spec.js b/test/unit/app/buy-eth-url.spec.js index 36646fa685c2..6cf3e7d75386 100644 --- a/test/unit/app/buy-eth-url.spec.js +++ b/test/unit/app/buy-eth-url.spec.js @@ -18,14 +18,9 @@ describe('', function () { } it('returns coinbase url with amount and address for network 1', function () { - const coinbaseUrl = getBuyEthUrl(mainnet) - const coinbase = coinbaseUrl.match(/(https:\/\/buy.coinbase.com)/) - const amount = coinbaseUrl.match(/(amount)\D\d/) - const address = coinbaseUrl.match(/(address)(.*)(?=&)/) - - assert.equal(coinbase[0], 'https://buy.coinbase.com') - assert.equal(amount[0], 'amount=5') - assert.equal(address[0], 'address=0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc') + const wyreUrl = getBuyEthUrl(mainnet) + + assert.equal(wyreUrl, 'https://dash.sendwyre.com/sign-up') }) diff --git a/test/unit/app/controllers/address-book-controller.js b/test/unit/app/controllers/address-book-controller.js deleted file mode 100644 index 1350e1a61fea..000000000000 --- a/test/unit/app/controllers/address-book-controller.js +++ /dev/null @@ -1,54 +0,0 @@ -const assert = require('assert') -const AddressBookController = require('../../../../app/scripts/controllers/address-book') - -const stubPreferencesStore = { - getState: function () { - return { - identities: { - '0x0aaa': { - address: '0x0aaa', - name: 'owned', - }, - }, - } - }, -} - -describe('address-book-controller', function () { - var addressBookController - - beforeEach(function () { - addressBookController = new AddressBookController({ - preferencesStore: stubPreferencesStore, - }) - }) - - describe('addres book management', function () { - describe('#_getAddressBook', function () { - it('should be empty by default.', function () { - assert.equal(addressBookController._getAddressBook().length, 0) - }) - }) - describe('#setAddressBook', function () { - it('should properly set a new address.', function () { - addressBookController.setAddressBook('0x01234', 'test') - var addressBook = addressBookController._getAddressBook() - assert.equal(addressBook.length, 1, 'incorrect address book length.') - assert.equal(addressBook[0].address, '0x01234', 'incorrect addresss') - assert.equal(addressBook[0].name, 'test', 'incorrect nickname') - }) - - it('should reject duplicates.', function () { - addressBookController.setAddressBook('0x01234', 'test') - addressBookController.setAddressBook('0x01234', 'test') - var addressBook = addressBookController._getAddressBook() - assert.equal(addressBook.length, 1, 'incorrect address book length.') - }) - it('should not add any identities that are under user control', function () { - addressBookController.setAddressBook('0x0aaa', ' ') - var addressBook = addressBookController._getAddressBook() - assert.equal(addressBook.length, 0, 'incorrect address book length.') - }) - }) - }) -}) diff --git a/test/unit/balance-formatter-test.js b/test/unit/balance-formatter-test.js index ab6daa19c9b3..bd0eb50087a4 100644 --- a/test/unit/balance-formatter-test.js +++ b/test/unit/balance-formatter-test.js @@ -1,6 +1,6 @@ const assert = require('assert') const currencyFormatter = require('currency-formatter') -const infuraConversion = require('../../ui/app/infura-conversion.json') +const infuraConversion = require('../../ui/app/helpers/constants/infura-conversion.json') describe('currencyFormatting', function () { it('be able to format any infura currency', function (done) { diff --git a/test/unit/reducers/unlock_vault_test.js b/test/unit/reducers/unlock_vault_test.js index d66e8edbb879..d66891a63695 100644 --- a/test/unit/reducers/unlock_vault_test.js +++ b/test/unit/reducers/unlock_vault_test.js @@ -4,8 +4,8 @@ var assert = require('assert') var path = require('path') var sinon = require('sinon') -var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) -var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) +var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'store', 'actions.js')) +var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'ducks', 'index.js')) describe('#unlockMetamask(selectedAccount)', function () { beforeEach(function () { diff --git a/test/unit/responsive/components/dropdown-test.js b/test/unit/responsive/components/dropdown-test.js index f3f236d90e8b..1fadbfb6012f 100644 --- a/test/unit/responsive/components/dropdown-test.js +++ b/test/unit/responsive/components/dropdown-test.js @@ -3,7 +3,7 @@ const assert = require('assert') const h = require('react-hyperscript') const sinon = require('sinon') const path = require('path') -const Dropdown = require(path.join(__dirname, '..', '..', '..', '..', 'ui', 'app', 'components', 'dropdowns', 'index.js')).Dropdown +const Dropdown = require(path.join(__dirname, '..', '..', '..', '..', 'ui', 'app', 'components', 'app', 'dropdowns', 'index.js')).Dropdown const { createMockStore } = require('redux-test-utils') const { mountWithStore } = require('../../../lib/render-helpers') diff --git a/test/unit/ui/app/actions.spec.js b/test/unit/ui/app/actions.spec.js index 8d7de8b029b2..46e94bb320fe 100644 --- a/test/unit/ui/app/actions.spec.js +++ b/test/unit/ui/app/actions.spec.js @@ -16,7 +16,7 @@ const { createTestProviderTools } = require('../../../stub/provider') const provider = createTestProviderTools({ scaffold: {}}).provider const enLocale = require('../../../../app/_locales/en/messages.json') -const actions = require('../../../../ui/app/actions') +const actions = require('../../../../ui/app/store/actions') const MetaMaskController = require('../../../../app/scripts/metamask-controller') const firstTimeState = require('../../../unit/localhostState') diff --git a/test/unit/ui/app/components/token-cell.spec.js b/test/unit/ui/app/components/token-cell.spec.js index 6145c692470f..23e76c41876a 100644 --- a/test/unit/ui/app/components/token-cell.spec.js +++ b/test/unit/ui/app/components/token-cell.spec.js @@ -5,8 +5,8 @@ import { Provider } from 'react-redux' import configureMockStore from 'redux-mock-store' import { mount } from 'enzyme' -import TokenCell from '../../../../../ui/app/components/token-cell' -import Identicon from '../../../../../ui/app/components/identicon' +import TokenCell from '../../../../../ui/app/components/app/token-cell' +import Identicon from '../../../../../ui/app/components/ui/identicon' describe('Token Cell', () => { let wrapper diff --git a/test/unit/ui/app/reducers/app.spec.js b/test/unit/ui/app/reducers/app.spec.js index bee4963e5c6f..6c77e0ef9ea9 100644 --- a/test/unit/ui/app/reducers/app.spec.js +++ b/test/unit/ui/app/reducers/app.spec.js @@ -1,6 +1,6 @@ import assert from 'assert' -import reduceApp from '../../../../../ui/app/reducers/app' -import * as actions from '../../../../../ui/app/actions' +import reduceApp from '../../../../../ui/app/ducks/app/app' +import * as actions from '../../../../../ui/app/store/actions' describe('App State', () => { diff --git a/test/unit/ui/app/reducers/metamask.spec.js b/test/unit/ui/app/reducers/metamask.spec.js index 8cdb780fec55..388c67c76fc9 100644 --- a/test/unit/ui/app/reducers/metamask.spec.js +++ b/test/unit/ui/app/reducers/metamask.spec.js @@ -1,6 +1,6 @@ import assert from 'assert' -import reduceMetamask from '../../../../../ui/app/reducers/metamask' -import * as actions from '../../../../../ui/app/actions' +import reduceMetamask from '../../../../../ui/app/ducks/metamask/metamask' +import * as actions from '../../../../../ui/app/store/actions' describe('MetaMask Reducers', () => { diff --git a/test/unit/ui/app/selectors.spec.js b/test/unit/ui/app/selectors.spec.js index 070de0bcd394..b4aa8e272a58 100644 --- a/test/unit/ui/app/selectors.spec.js +++ b/test/unit/ui/app/selectors.spec.js @@ -1,5 +1,5 @@ const assert = require('assert') -const selectors = require('../../../../ui/app/selectors') +const selectors = require('../../../../ui/app/selectors/selectors') const mockState = require('../../../data/mock-state.json') const Eth = require('ethjs') diff --git a/test/unit/util_test.js b/test/unit/util_test.js index 39473854f8ff..87f57b218ef7 100644 --- a/test/unit/util_test.js +++ b/test/unit/util_test.js @@ -3,7 +3,7 @@ var sinon = require('sinon') const ethUtil = require('ethereumjs-util') var path = require('path') -var util = require(path.join(__dirname, '..', '..', 'ui', 'app', 'util.js')) +var util = require(path.join(__dirname, '..', '..', 'ui', 'app', 'helpers', 'utils', 'util.js')) describe('util', function () { var ethInWei = '1' diff --git a/ui/.gitignore b/ui/.gitignore deleted file mode 100644 index c6b1254b5fba..000000000000 --- a/ui/.gitignore +++ /dev/null @@ -1,66 +0,0 @@ - -# Created by https://www.gitignore.io/api/osx,node - -### OSX ### -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - - -### Node ### -# Logs -logs -*.log -npm-debug.log* - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git -node_modules - -# Optional npm cache directory -.npm - -# Optional REPL history -.node_repl_history - diff --git a/ui/app/accounts/new-account/index.js b/ui/app/accounts/new-account/index.js deleted file mode 100644 index 795bd7ce681c..000000000000 --- a/ui/app/accounts/new-account/index.js +++ /dev/null @@ -1,87 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const PropTypes = require('prop-types') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const actions = require('../../actions') -const { getCurrentViewContext } = require('../../selectors') -const classnames = require('classnames') - -const NewAccountCreateForm = require('./create-form') -const NewAccountImportForm = require('../import') - -function mapStateToProps (state) { - return { - displayedForm: getCurrentViewContext(state), - } -} - -function mapDispatchToProps (dispatch) { - return { - displayForm: form => dispatch(actions.setNewAccountForm(form)), - showQrView: (selected, identity) => dispatch(actions.showQrView(selected, identity)), - showExportPrivateKeyModal: () => { - dispatch(actions.showModal({ name: 'EXPORT_PRIVATE_KEY' })) - }, - hideModal: () => dispatch(actions.hideModal()), - setAccountLabel: (address, label) => dispatch(actions.setAccountLabel(address, label)), - } -} - -inherits(AccountDetailsModal, Component) -function AccountDetailsModal (props) { - Component.call(this) - - this.state = { - displayedForm: props.displayedForm, - } -} - -AccountDetailsModal.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(AccountDetailsModal) - - -AccountDetailsModal.prototype.render = function () { - const { displayedForm, displayForm } = this.props - - return h('div.new-account', {}, [ - - h('div.new-account__header', [ - - h('div.new-account__title', this.context.t('newAccount')), - - h('div.new-account__tabs', [ - - h('div.new-account__tabs__tab', { - className: classnames('new-account__tabs__tab', { - 'new-account__tabs__selected': displayedForm === 'CREATE', - 'new-account__tabs__unselected cursor-pointer': displayedForm !== 'CREATE', - }), - onClick: () => displayForm('CREATE'), - }, this.context.t('createDen')), - - h('div.new-account__tabs__tab', { - className: classnames('new-account__tabs__tab', { - 'new-account__tabs__selected': displayedForm === 'IMPORT', - 'new-account__tabs__unselected cursor-pointer': displayedForm !== 'IMPORT', - }), - onClick: () => displayForm('IMPORT'), - }, this.context.t('import')), - - ]), - - ]), - - h('div.new-account__form', [ - - displayedForm === 'CREATE' - ? h(NewAccountCreateForm) - : h(NewAccountImportForm), - - ]), - - ]) -} diff --git a/ui/app/components/account-dropdowns.js b/ui/app/components/app/account-dropdowns.js similarity index 98% rename from ui/app/components/account-dropdowns.js rename to ui/app/components/app/account-dropdowns.js index b05ba219cabb..e02d17e549b1 100644 --- a/ui/app/components/account-dropdowns.js +++ b/ui/app/components/app/account-dropdowns.js @@ -1,15 +1,15 @@ const Component = require('react').Component const PropTypes = require('prop-types') const h = require('react-hyperscript') -const actions = require('../actions') +const actions = require('../../store/actions') const genAccountLink = require('etherscan-link').createAccountLink const connect = require('react-redux').connect const Dropdown = require('./dropdown').Dropdown const DropdownMenuItem = require('./dropdown').DropdownMenuItem const copyToClipboard = require('copy-to-clipboard') -const { checksumAddress } = require('../util') +const { checksumAddress } = require('../../helpers/utils/util') -import Identicon from './identicon' +import Identicon from '../ui/identicon' class AccountDropdowns extends Component { constructor (props) { diff --git a/ui/app/components/account-menu/account-menu.component.js b/ui/app/components/app/account-menu/account-menu.component.js similarity index 95% rename from ui/app/components/account-menu/account-menu.component.js rename to ui/app/components/app/account-menu/account-menu.component.js index ce7482108fcc..972ea492ee62 100644 --- a/ui/app/components/account-menu/account-menu.component.js +++ b/ui/app/components/app/account-menu/account-menu.component.js @@ -2,12 +2,12 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import debounce from 'lodash.debounce' import { Menu, Item, Divider, CloseArea } from '../dropdowns/components/menu' -import { ENVIRONMENT_TYPE_POPUP } from '../../../../app/scripts/lib/enums' -import { getEnvironmentType } from '../../../../app/scripts/lib/util' -import Tooltip from '../tooltip' -import Identicon from '../identicon' +import { ENVIRONMENT_TYPE_POPUP } from '../../../../../app/scripts/lib/enums' +import { getEnvironmentType } from '../../../../../app/scripts/lib/util' +import Tooltip from '../../ui/tooltip' +import Identicon from '../../ui/identicon' import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display' -import { PRIMARY } from '../../constants/common' +import { PRIMARY } from '../../../helpers/constants/common' import { SETTINGS_ROUTE, INFO_ROUTE, @@ -15,7 +15,7 @@ import { IMPORT_ACCOUNT_ROUTE, CONNECT_HARDWARE_ROUTE, DEFAULT_ROUTE, -} from '../../routes' +} from '../../../helpers/constants/routes' export default class AccountMenu extends PureComponent { static contextTypes = { @@ -28,6 +28,7 @@ export default class AccountMenu extends PureComponent { history: PropTypes.object, identities: PropTypes.object, isAccountMenuOpen: PropTypes.bool, + prevIsAccountMenuOpen: PropTypes.bool, keyrings: PropTypes.array, lockMetamask: PropTypes.func, selectedAddress: PropTypes.string, diff --git a/ui/app/components/account-menu/account-menu.container.js b/ui/app/components/app/account-menu/account-menu.container.js similarity index 93% rename from ui/app/components/account-menu/account-menu.container.js rename to ui/app/components/app/account-menu/account-menu.container.js index 93246ec72c31..ae2e28e7698e 100644 --- a/ui/app/components/account-menu/account-menu.container.js +++ b/ui/app/components/app/account-menu/account-menu.container.js @@ -10,8 +10,8 @@ import { showConfigPage, showInfoPage, showModal, -} from '../../actions' -import { getMetaMaskAccounts } from '../../selectors' +} from '../../../store/actions' +import { getMetaMaskAccounts } from '../../../selectors/selectors' import AccountMenu from './account-menu.component' function mapStateToProps (state) { diff --git a/ui/app/components/account-menu/index.js b/ui/app/components/app/account-menu/index.js similarity index 100% rename from ui/app/components/account-menu/index.js rename to ui/app/components/app/account-menu/index.js diff --git a/ui/app/components/account-menu/index.scss b/ui/app/components/app/account-menu/index.scss similarity index 100% rename from ui/app/components/account-menu/index.scss rename to ui/app/components/app/account-menu/index.scss diff --git a/ui/app/components/account-panel.js b/ui/app/components/app/account-panel.js similarity index 91% rename from ui/app/components/account-panel.js rename to ui/app/components/app/account-panel.js index a379ed3ac9e7..79882f34a6fa 100644 --- a/ui/app/components/account-panel.js +++ b/ui/app/components/app/account-panel.js @@ -1,9 +1,9 @@ const inherits = require('util').inherits const Component = require('react').Component const h = require('react-hyperscript') -import Identicon from './identicon' -const formatBalance = require('../util').formatBalance -const addressSummary = require('../util').addressSummary +import Identicon from '../ui/identicon' +const formatBalance = require('../../helpers/utils/util').formatBalance +const addressSummary = require('../../helpers/utils/util').addressSummary module.exports = AccountPanel diff --git a/ui/app/components/add-token-button/add-token-button.component.js b/ui/app/components/app/add-token-button/add-token-button.component.js similarity index 100% rename from ui/app/components/add-token-button/add-token-button.component.js rename to ui/app/components/app/add-token-button/add-token-button.component.js diff --git a/ui/app/components/add-token-button/index.js b/ui/app/components/app/add-token-button/index.js similarity index 100% rename from ui/app/components/add-token-button/index.js rename to ui/app/components/app/add-token-button/index.js diff --git a/ui/app/components/add-token-button/index.scss b/ui/app/components/app/add-token-button/index.scss similarity index 100% rename from ui/app/components/add-token-button/index.scss rename to ui/app/components/app/add-token-button/index.scss diff --git a/ui/app/components/app-header/app-header.component.js b/ui/app/components/app/app-header/app-header.component.js similarity index 96% rename from ui/app/components/app-header/app-header.component.js rename to ui/app/components/app/app-header/app-header.component.js index 14f8b9f304ec..343e0daab433 100644 --- a/ui/app/components/app-header/app-header.component.js +++ b/ui/app/components/app/app-header/app-header.component.js @@ -1,8 +1,8 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import Identicon from '../identicon' -import { DEFAULT_ROUTE } from '../../routes' +import Identicon from '../../ui/identicon' +import { DEFAULT_ROUTE } from '../../../helpers/constants/routes' const NetworkIndicator = require('../network') export default class AppHeader extends PureComponent { diff --git a/ui/app/components/app-header/app-header.container.js b/ui/app/components/app/app-header/app-header.container.js similarity index 94% rename from ui/app/components/app-header/app-header.container.js rename to ui/app/components/app/app-header/app-header.container.js index 1abc2afeb209..b673382451b4 100644 --- a/ui/app/components/app-header/app-header.container.js +++ b/ui/app/components/app/app-header/app-header.container.js @@ -3,7 +3,7 @@ import { withRouter } from 'react-router-dom' import { compose } from 'recompose' import AppHeader from './app-header.component' -const actions = require('../../actions') +const actions = require('../../../store/actions') const mapStateToProps = state => { const { appState, metamask } = state diff --git a/ui/app/components/app-header/index.js b/ui/app/components/app/app-header/index.js similarity index 100% rename from ui/app/components/app-header/index.js rename to ui/app/components/app/app-header/index.js diff --git a/ui/app/components/app-header/index.scss b/ui/app/components/app/app-header/index.scss similarity index 100% rename from ui/app/components/app-header/index.scss rename to ui/app/components/app/app-header/index.scss diff --git a/ui/app/components/bn-as-decimal-input.js b/ui/app/components/app/bn-as-decimal-input.js similarity index 100% rename from ui/app/components/bn-as-decimal-input.js rename to ui/app/components/app/bn-as-decimal-input.js diff --git a/ui/app/components/coinbase-form.js b/ui/app/components/app/coinbase-form.js similarity index 96% rename from ui/app/components/coinbase-form.js rename to ui/app/components/app/coinbase-form.js index d5915292ed04..24d2876040b3 100644 --- a/ui/app/components/coinbase-form.js +++ b/ui/app/components/app/coinbase-form.js @@ -3,7 +3,7 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect -const actions = require('../actions') +const actions = require('../../store/actions') CoinbaseForm.contextTypes = { t: PropTypes.func, diff --git a/ui/app/components/confirm-page-container/confirm-detail-row/confirm-detail-row.component.js b/ui/app/components/app/confirm-page-container/confirm-detail-row/confirm-detail-row.component.js similarity index 96% rename from ui/app/components/confirm-page-container/confirm-detail-row/confirm-detail-row.component.js rename to ui/app/components/app/confirm-page-container/confirm-detail-row/confirm-detail-row.component.js index c7262d2a9638..18571eccbfb4 100644 --- a/ui/app/components/confirm-page-container/confirm-detail-row/confirm-detail-row.component.js +++ b/ui/app/components/app/confirm-page-container/confirm-detail-row/confirm-detail-row.component.js @@ -2,7 +2,7 @@ import React from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' import UserPreferencedCurrencyDisplay from '../../user-preferenced-currency-display' -import { PRIMARY, SECONDARY } from '../../../constants/common' +import { PRIMARY, SECONDARY } from '../../../../helpers/constants/common' const ConfirmDetailRow = props => { const { diff --git a/ui/app/components/confirm-page-container/confirm-detail-row/index.js b/ui/app/components/app/confirm-page-container/confirm-detail-row/index.js similarity index 100% rename from ui/app/components/confirm-page-container/confirm-detail-row/index.js rename to ui/app/components/app/confirm-page-container/confirm-detail-row/index.js diff --git a/ui/app/components/confirm-page-container/confirm-detail-row/index.scss b/ui/app/components/app/confirm-page-container/confirm-detail-row/index.scss similarity index 100% rename from ui/app/components/confirm-page-container/confirm-detail-row/index.scss rename to ui/app/components/app/confirm-page-container/confirm-detail-row/index.scss diff --git a/ui/app/components/confirm-page-container/confirm-detail-row/tests/confirm-detail-row.component.test.js b/ui/app/components/app/confirm-page-container/confirm-detail-row/tests/confirm-detail-row.component.test.js similarity index 100% rename from ui/app/components/confirm-page-container/confirm-detail-row/tests/confirm-detail-row.component.test.js rename to ui/app/components/app/confirm-page-container/confirm-detail-row/tests/confirm-detail-row.component.test.js diff --git a/ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js similarity index 96% rename from ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js rename to ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js index 1dca81560df1..8a5f90c7630f 100644 --- a/ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js +++ b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js @@ -1,9 +1,9 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import { Tabs, Tab } from '../../tabs' -import { ConfirmPageContainerSummary, ConfirmPageContainerWarning } from './' -import ErrorMessage from '../../error-message' +import { Tabs, Tab } from '../../../ui/tabs' +import { ConfirmPageContainerSummary, ConfirmPageContainerWarning } from '.' +import ErrorMessage from '../../../ui/error-message' export default class ConfirmPageContainerContent extends Component { static propTypes = { diff --git a/ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js similarity index 97% rename from ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js rename to ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js index 89ceb015f2a9..0cc4d8262bab 100644 --- a/ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js +++ b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import Identicon from '../../../identicon' +import Identicon from '../../../../ui/identicon' const ConfirmPageContainerSummary = props => { const { diff --git a/ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.js b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.js similarity index 100% rename from ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.js rename to ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.js diff --git a/ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss similarity index 100% rename from ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss rename to ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss diff --git a/ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/confirm-page-container-warning.component.js b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/confirm-page-container-warning.component.js similarity index 100% rename from ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/confirm-page-container-warning.component.js rename to ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/confirm-page-container-warning.component.js diff --git a/ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/index.js b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/index.js similarity index 100% rename from ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/index.js rename to ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/index.js diff --git a/ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/index.scss b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/index.scss similarity index 100% rename from ui/app/components/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/index.scss rename to ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/index.scss diff --git a/ui/app/components/confirm-page-container/confirm-page-container-content/index.js b/ui/app/components/app/confirm-page-container/confirm-page-container-content/index.js similarity index 100% rename from ui/app/components/confirm-page-container/confirm-page-container-content/index.js rename to ui/app/components/app/confirm-page-container/confirm-page-container-content/index.js diff --git a/ui/app/components/confirm-page-container/confirm-page-container-content/index.scss b/ui/app/components/app/confirm-page-container/confirm-page-container-content/index.scss similarity index 91% rename from ui/app/components/confirm-page-container/confirm-page-container-content/index.scss rename to ui/app/components/app/confirm-page-container/confirm-page-container-content/index.scss index 78639a4351f9..602a468488c6 100644 --- a/ui/app/components/confirm-page-container/confirm-page-container-content/index.scss +++ b/ui/app/components/app/confirm-page-container/confirm-page-container-content/index.scss @@ -1,6 +1,6 @@ -@import './confirm-page-container-warning/index'; +@import 'confirm-page-container-warning/index'; -@import './confirm-page-container-summary/index'; +@import 'confirm-page-container-summary/index'; .confirm-page-container-content { overflow-y: auto; diff --git a/ui/app/components/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.js b/ui/app/components/app/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.js similarity index 96% rename from ui/app/components/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.js rename to ui/app/components/app/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.js index e6fe8f82c237..84ca40da5b09 100644 --- a/ui/app/components/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.js +++ b/ui/app/components/app/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types' import { ENVIRONMENT_TYPE_POPUP, ENVIRONMENT_TYPE_NOTIFICATION, -} from '../../../../../app/scripts/lib/enums' +} from '../../../../../../app/scripts/lib/enums' import NetworkDisplay from '../../network-display' export default class ConfirmPageContainer extends Component { diff --git a/ui/app/components/confirm-page-container/confirm-page-container-header/index.js b/ui/app/components/app/confirm-page-container/confirm-page-container-header/index.js similarity index 100% rename from ui/app/components/confirm-page-container/confirm-page-container-header/index.js rename to ui/app/components/app/confirm-page-container/confirm-page-container-header/index.js diff --git a/ui/app/components/confirm-page-container/confirm-page-container-header/index.scss b/ui/app/components/app/confirm-page-container/confirm-page-container-header/index.scss similarity index 100% rename from ui/app/components/confirm-page-container/confirm-page-container-header/index.scss rename to ui/app/components/app/confirm-page-container/confirm-page-container-header/index.scss diff --git a/ui/app/components/confirm-page-container/confirm-page-container-navigation/confirm-page-container-navigation.component.js b/ui/app/components/app/confirm-page-container/confirm-page-container-navigation/confirm-page-container-navigation.component.js similarity index 100% rename from ui/app/components/confirm-page-container/confirm-page-container-navigation/confirm-page-container-navigation.component.js rename to ui/app/components/app/confirm-page-container/confirm-page-container-navigation/confirm-page-container-navigation.component.js diff --git a/ui/app/components/confirm-page-container/confirm-page-container-navigation/index.js b/ui/app/components/app/confirm-page-container/confirm-page-container-navigation/index.js similarity index 100% rename from ui/app/components/confirm-page-container/confirm-page-container-navigation/index.js rename to ui/app/components/app/confirm-page-container/confirm-page-container-navigation/index.js diff --git a/ui/app/components/confirm-page-container/confirm-page-container-navigation/index.scss b/ui/app/components/app/confirm-page-container/confirm-page-container-navigation/index.scss similarity index 100% rename from ui/app/components/confirm-page-container/confirm-page-container-navigation/index.scss rename to ui/app/components/app/confirm-page-container/confirm-page-container-navigation/index.scss diff --git a/ui/app/components/confirm-page-container/confirm-page-container.component.js b/ui/app/components/app/confirm-page-container/confirm-page-container.component.js similarity index 96% rename from ui/app/components/confirm-page-container/confirm-page-container.component.js rename to ui/app/components/app/confirm-page-container/confirm-page-container.component.js index 10edf3b16397..326e4f83e673 100644 --- a/ui/app/components/confirm-page-container/confirm-page-container.component.js +++ b/ui/app/components/app/confirm-page-container/confirm-page-container.component.js @@ -1,8 +1,8 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import SenderToRecipient from '../sender-to-recipient' -import { PageContainerFooter } from '../page-container' -import { ConfirmPageContainerHeader, ConfirmPageContainerContent, ConfirmPageContainerNavigation } from './' +import SenderToRecipient from '../../ui/sender-to-recipient' +import { PageContainerFooter } from '../../ui/page-container' +import { ConfirmPageContainerHeader, ConfirmPageContainerContent, ConfirmPageContainerNavigation } from '.' export default class ConfirmPageContainer extends Component { static contextTypes = { diff --git a/ui/app/components/confirm-page-container/index.js b/ui/app/components/app/confirm-page-container/index.js similarity index 100% rename from ui/app/components/confirm-page-container/index.js rename to ui/app/components/app/confirm-page-container/index.js diff --git a/ui/app/components/app/confirm-page-container/index.scss b/ui/app/components/app/confirm-page-container/index.scss new file mode 100644 index 000000000000..c0277eff57e5 --- /dev/null +++ b/ui/app/components/app/confirm-page-container/index.scss @@ -0,0 +1,7 @@ +@import 'confirm-page-container-content/index'; + +@import 'confirm-page-container-header/index'; + +@import 'confirm-detail-row/index'; + +@import 'confirm-page-container-navigation/index'; diff --git a/ui/app/components/copyable.js b/ui/app/components/app/copyable.js similarity index 96% rename from ui/app/components/copyable.js rename to ui/app/components/app/copyable.js index ad504deb8a28..6869d674d932 100644 --- a/ui/app/components/copyable.js +++ b/ui/app/components/app/copyable.js @@ -3,7 +3,7 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const inherits = require('util').inherits -const Tooltip = require('./tooltip') +const Tooltip = require('../ui/tooltip') const copyToClipboard = require('copy-to-clipboard') const connect = require('react-redux').connect diff --git a/ui/app/components/customize-gas-modal/gas-modal-card.js b/ui/app/components/app/customize-gas-modal/gas-modal-card.js similarity index 100% rename from ui/app/components/customize-gas-modal/gas-modal-card.js rename to ui/app/components/app/customize-gas-modal/gas-modal-card.js diff --git a/ui/app/components/customize-gas-modal/gas-slider.js b/ui/app/components/app/customize-gas-modal/gas-slider.js similarity index 100% rename from ui/app/components/customize-gas-modal/gas-slider.js rename to ui/app/components/app/customize-gas-modal/gas-slider.js diff --git a/ui/app/components/customize-gas-modal/index.js b/ui/app/components/app/customize-gas-modal/index.js similarity index 97% rename from ui/app/components/customize-gas-modal/index.js rename to ui/app/components/app/customize-gas-modal/index.js index fd660ead283f..dca77bb00b8a 100644 --- a/ui/app/components/customize-gas-modal/index.js +++ b/ui/app/components/app/customize-gas-modal/index.js @@ -4,15 +4,15 @@ const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect const BigNumber = require('bignumber.js') -const actions = require('../../actions') +const actions = require('../../../store/actions') const GasModalCard = require('./gas-modal-card') -import Button from '../button' +import Button from '../../ui/button' const ethUtil = require('ethereumjs-util') import { updateSendErrors, -} from '../../ducks/send.duck' +} from '../../../ducks/send/send.duck' const { MIN_GAS_PRICE_DEC, @@ -30,7 +30,7 @@ const { conversionGreaterThan, conversionMax, subtractCurrencies, -} = require('../../conversion-util') +} = require('../../../helpers/utils/conversion-util') const { getGasIsLoading, @@ -42,7 +42,7 @@ const { getCurrentAccountWithSendEtherInfo, getSelectedTokenToFiatRate, getSendMaxModeState, -} = require('../../selectors') +} = require('../../../selectors/selectors') const { getGasPrice, diff --git a/ui/app/components/dropdowns/account-details-dropdown.js b/ui/app/components/app/dropdowns/account-details-dropdown.js similarity index 95% rename from ui/app/components/dropdowns/account-details-dropdown.js rename to ui/app/components/app/dropdowns/account-details-dropdown.js index bda8b9517834..3d45989466ab 100644 --- a/ui/app/components/dropdowns/account-details-dropdown.js +++ b/ui/app/components/app/dropdowns/account-details-dropdown.js @@ -3,9 +3,9 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect -const actions = require('../../actions') -const { getSelectedIdentity } = require('../../selectors') -const genAccountLink = require('../../../lib/account-link.js') +const actions = require('../../../store/actions') +const { getSelectedIdentity } = require('../../../selectors/selectors') +const genAccountLink = require('../../../../lib/account-link.js') const { Menu, Item, CloseArea } = require('./components/menu') AccountDetailsDropdown.contextTypes = { diff --git a/ui/app/components/dropdowns/components/account-dropdowns.js b/ui/app/components/app/dropdowns/components/account-dropdowns.js similarity index 97% rename from ui/app/components/dropdowns/components/account-dropdowns.js rename to ui/app/components/app/dropdowns/components/account-dropdowns.js index e6b3e0c0c447..c603a9a9fa2c 100644 --- a/ui/app/components/dropdowns/components/account-dropdowns.js +++ b/ui/app/components/app/dropdowns/components/account-dropdowns.js @@ -1,15 +1,15 @@ const Component = require('react').Component const PropTypes = require('prop-types') const h = require('react-hyperscript') -const actions = require('../../../actions') -const genAccountLink = require('../../../../lib/account-link.js') +const actions = require('../../../../store/actions') +const genAccountLink = require('../../../../../lib/account-link.js') const connect = require('react-redux').connect const Dropdown = require('./dropdown').Dropdown const DropdownMenuItem = require('./dropdown').DropdownMenuItem -import Identicon from '../../identicon' -const { checksumAddress } = require('../../../util') +import Identicon from '../../../ui/identicon' +const { checksumAddress } = require('../../../../helpers/utils/util') const copyToClipboard = require('copy-to-clipboard') -const { formatBalance } = require('../../../util') +const { formatBalance } = require('../../../../helpers/utils/util') class AccountDropdowns extends Component { diff --git a/ui/app/components/dropdowns/components/dropdown.js b/ui/app/components/app/dropdowns/components/dropdown.js similarity index 100% rename from ui/app/components/dropdowns/components/dropdown.js rename to ui/app/components/app/dropdowns/components/dropdown.js diff --git a/ui/app/components/dropdowns/components/menu.js b/ui/app/components/app/dropdowns/components/menu.js similarity index 100% rename from ui/app/components/dropdowns/components/menu.js rename to ui/app/components/app/dropdowns/components/menu.js diff --git a/ui/app/components/dropdowns/components/network-dropdown-icon.js b/ui/app/components/app/dropdowns/components/network-dropdown-icon.js similarity index 100% rename from ui/app/components/dropdowns/components/network-dropdown-icon.js rename to ui/app/components/app/dropdowns/components/network-dropdown-icon.js diff --git a/ui/app/components/dropdowns/index.js b/ui/app/components/app/dropdowns/index.js similarity index 100% rename from ui/app/components/dropdowns/index.js rename to ui/app/components/app/dropdowns/index.js diff --git a/ui/app/components/dropdowns/network-dropdown.js b/ui/app/components/app/dropdowns/network-dropdown.js similarity index 98% rename from ui/app/components/dropdowns/network-dropdown.js rename to ui/app/components/app/dropdowns/network-dropdown.js index 90355a97c433..3d9037a06fbb 100644 --- a/ui/app/components/dropdowns/network-dropdown.js +++ b/ui/app/components/app/dropdowns/network-dropdown.js @@ -5,12 +5,12 @@ const inherits = require('util').inherits const connect = require('react-redux').connect const { withRouter } = require('react-router-dom') const { compose } = require('recompose') -const actions = require('../../actions') +const actions = require('../../../store/actions') const Dropdown = require('./components/dropdown').Dropdown const DropdownMenuItem = require('./components/dropdown').DropdownMenuItem const NetworkDropdownIcon = require('./components/network-dropdown-icon') const R = require('ramda') -const { SETTINGS_ROUTE } = require('../../routes') +const { ADVANCED_ROUTE } = require('../../../helpers/constants/routes') // classes from nodes of the toggle element. const notToggleElementClassnames = [ @@ -233,7 +233,7 @@ NetworkDropdown.prototype.render = function () { DropdownMenuItem, { closeMenu: () => this.props.hideNetworkDropdown(), - onClick: () => this.props.history.push(SETTINGS_ROUTE), + onClick: () => this.props.history.push(ADVANCED_ROUTE), style: dropdownMenuItemStyle, }, [ diff --git a/ui/app/components/dropdowns/simple-dropdown.js b/ui/app/components/app/dropdowns/simple-dropdown.js similarity index 100% rename from ui/app/components/dropdowns/simple-dropdown.js rename to ui/app/components/app/dropdowns/simple-dropdown.js diff --git a/ui/app/components/dropdowns/tests/dropdown.test.js b/ui/app/components/app/dropdowns/tests/dropdown.test.js similarity index 100% rename from ui/app/components/dropdowns/tests/dropdown.test.js rename to ui/app/components/app/dropdowns/tests/dropdown.test.js diff --git a/ui/app/components/dropdowns/tests/menu.test.js b/ui/app/components/app/dropdowns/tests/menu.test.js similarity index 100% rename from ui/app/components/dropdowns/tests/menu.test.js rename to ui/app/components/app/dropdowns/tests/menu.test.js diff --git a/ui/app/components/dropdowns/tests/network-dropdown-icon.test.js b/ui/app/components/app/dropdowns/tests/network-dropdown-icon.test.js similarity index 100% rename from ui/app/components/dropdowns/tests/network-dropdown-icon.test.js rename to ui/app/components/app/dropdowns/tests/network-dropdown-icon.test.js diff --git a/ui/app/components/dropdowns/tests/network-dropdown.test.js b/ui/app/components/app/dropdowns/tests/network-dropdown.test.js similarity index 97% rename from ui/app/components/dropdowns/tests/network-dropdown.test.js rename to ui/app/components/app/dropdowns/tests/network-dropdown.test.js index 88ad568516b3..91e7899a7b9d 100644 --- a/ui/app/components/dropdowns/tests/network-dropdown.test.js +++ b/ui/app/components/app/dropdowns/tests/network-dropdown.test.js @@ -1,7 +1,7 @@ import React from 'react' import assert from 'assert' import { createMockStore } from 'redux-test-utils' -import { mountWithRouter } from '../../../../../test/lib/render-helpers' +import { mountWithRouter } from '../../../../../../test/lib/render-helpers' import NetworkDropdown from '../network-dropdown' import { DropdownMenuItem } from '../components/dropdown' import NetworkDropdownIcon from '../components/network-dropdown-icon' diff --git a/ui/app/components/dropdowns/token-menu-dropdown.js b/ui/app/components/app/dropdowns/token-menu-dropdown.js similarity index 97% rename from ui/app/components/dropdowns/token-menu-dropdown.js rename to ui/app/components/app/dropdowns/token-menu-dropdown.js index 8a072b1bc32c..e2730aea2111 100644 --- a/ui/app/components/dropdowns/token-menu-dropdown.js +++ b/ui/app/components/app/dropdowns/token-menu-dropdown.js @@ -3,7 +3,7 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect -const actions = require('../../actions') +const actions = require('../../../store/actions') const genAccountLink = require('etherscan-link').createAccountLink const { Menu, Item, CloseArea } = require('./components/menu') diff --git a/ui/app/components/ens-input.js b/ui/app/components/app/ens-input.js similarity index 98% rename from ui/app/components/ens-input.js rename to ui/app/components/app/ens-input.js index a9167e3b2609..274058a1ba5a 100644 --- a/ui/app/components/ens-input.js +++ b/ui/app/components/app/ens-input.js @@ -12,7 +12,7 @@ const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' const connect = require('react-redux').connect const ToAutoComplete = require('./send/to-autocomplete').default const log = require('loglevel') -const { isValidENSAddress } = require('../util') +const { isValidENSAddress } = require('../../helpers/utils/util') EnsInput.contextTypes = { t: PropTypes.func, diff --git a/ui/app/components/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js b/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js similarity index 90% rename from ui/app/components/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js rename to ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js index f0abff478076..95894140cbe7 100644 --- a/ui/app/components/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js +++ b/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js @@ -80,8 +80,18 @@ export default class AdvancedTabContent extends Component { 'advanced-gas-inputs__gas-edit-row__input--error': isInError && errorType === 'error', 'advanced-gas-inputs__gas-edit-row__input--warning': isInError && errorType === 'warning', })}> -
onChange(value + 1)}>
-
onChange(value - 1)}>
+
onChange(value + 1)} + > + +
+
onChange(Math.max(value - 1, 0))} + > + +
{ isInError ?
diff --git a/ui/app/components/gas-customization/advanced-gas-inputs/advanced-gas-inputs.container.js b/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.container.js similarity index 92% rename from ui/app/components/gas-customization/advanced-gas-inputs/advanced-gas-inputs.container.js rename to ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.container.js index a71d37b43902..90fef1a1b898 100644 --- a/ui/app/components/gas-customization/advanced-gas-inputs/advanced-gas-inputs.container.js +++ b/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.container.js @@ -1,10 +1,10 @@ import { connect } from 'react-redux' -import { showModal } from '../../../actions' +import { showModal } from '../../../../store/actions' import { decGWEIToHexWEI, decimalToHex, hexWEIToDecGWEI, -} from '../../../helpers/conversions.util' +} from '../../../../helpers/utils/conversions.util' import AdvancedGasInputs from './advanced-gas-inputs.component' function convertGasPriceForInputs (gasPriceInHexWEI) { diff --git a/ui/app/components/gas-customization/advanced-gas-inputs/index.js b/ui/app/components/app/gas-customization/advanced-gas-inputs/index.js similarity index 100% rename from ui/app/components/gas-customization/advanced-gas-inputs/index.js rename to ui/app/components/app/gas-customization/advanced-gas-inputs/index.js diff --git a/ui/app/components/gas-customization/advanced-gas-inputs/index.scss b/ui/app/components/app/gas-customization/advanced-gas-inputs/index.scss similarity index 100% rename from ui/app/components/gas-customization/advanced-gas-inputs/index.scss rename to ui/app/components/app/gas-customization/advanced-gas-inputs/index.scss diff --git a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js similarity index 82% rename from ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js index 366ad88c970f..ad862862198f 100644 --- a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import Loading from '../../../loading-screen' +import Loading from '../../../../ui/loading-screen' import GasPriceChart from '../../gas-price-chart' import debounce from 'lodash.debounce' @@ -23,6 +23,7 @@ export default class AdvancedTabContent extends Component { insufficientBalance: PropTypes.bool, customPriceIsSafe: PropTypes.bool, isSpeedUp: PropTypes.bool, + isEthereumNetwork: PropTypes.bool, } constructor (props) { @@ -88,8 +89,18 @@ export default class AdvancedTabContent extends Component { 'advanced-tab__gas-edit-row__input--error': isInError && errorType === 'error', 'advanced-tab__gas-edit-row__input--warning': isInError && errorType === 'warning', })}> -
onChange(value + 1)}>
-
onChange(value - 1)}>
+
onChange(value + 1)} + > + +
+
onChange(Math.max(value - 1, 0))} + > + +
{ isInError ?
@@ -178,6 +189,7 @@ export default class AdvancedTabContent extends Component { customPriceIsSafe, isSpeedUp, transactionFee, + isEthereumNetwork, } = this.props return ( @@ -193,15 +205,20 @@ export default class AdvancedTabContent extends Component { customPriceIsSafe, isSpeedUp, }) } -
{ t('liveGasPricePredictions') }
- {!gasEstimatesLoading - ? - : + { isEthereumNetwork + ?
+
{ t('liveGasPricePredictions') }
+ {!gasEstimatesLoading + ? + : + } +
+ { t('slower') } + { t('faster') } +
+
+ :
{ t('chartOnlyAvailableEth') }
} -
- { t('slower') } - { t('faster') } -
) diff --git a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/index.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/index.js similarity index 100% rename from ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/index.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/index.js diff --git a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/index.scss b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/index.scss similarity index 98% rename from ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/index.scss rename to ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/index.scss index 53cb84791633..20a503018eb2 100644 --- a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/index.scss +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/index.scss @@ -63,6 +63,10 @@ font-size: 10px; color: #888EA3; } + + .loading-overlay { + height: auto; + } } &__slider-container { diff --git a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/tests/advanced-tab-content-component.test.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/tests/advanced-tab-content-component.test.js similarity index 95% rename from ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/tests/advanced-tab-content-component.test.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/tests/advanced-tab-content-component.test.js index 2500ee26733b..5f7d909224f6 100644 --- a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/tests/advanced-tab-content-component.test.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/tests/advanced-tab-content-component.test.js @@ -1,11 +1,11 @@ import React from 'react' import assert from 'assert' -import shallow from '../../../../../../lib/shallow-with-context' +import shallow from '../../../../../../../lib/shallow-with-context' import sinon from 'sinon' import AdvancedTabContent from '../advanced-tab-content.component.js' import GasPriceChart from '../../../gas-price-chart' -import Loading from '../../../../loading-screen' +import Loading from '../../../../../ui/loading-screen' const propsMethodSpies = { updateCustomGasPrice: sinon.spy(), @@ -32,6 +32,7 @@ describe('AdvancedTabContent Component', function () { insufficientBalance={false} customPriceIsSafe={true} isSpeedUp={false} + isEthereumNetwork={true} />, { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } }) }) @@ -59,9 +60,9 @@ describe('AdvancedTabContent Component', function () { const feeChartDiv = advancedTabChildren.at(1) assert(feeChartDiv.childAt(0).hasClass('advanced-tab__gas-edit-rows')) - assert(feeChartDiv.childAt(1).hasClass('advanced-tab__fee-chart__title')) - assert(feeChartDiv.childAt(2).is(GasPriceChart)) - assert(feeChartDiv.childAt(3).hasClass('advanced-tab__fee-chart__speed-buttons')) + assert(feeChartDiv.childAt(1).childAt(0).hasClass('advanced-tab__fee-chart__title')) + assert(feeChartDiv.childAt(1).childAt(1).is(GasPriceChart)) + assert(feeChartDiv.childAt(1).childAt(2).hasClass('advanced-tab__fee-chart__speed-buttons')) }) it('should render a loading component instead of the chart if gasEstimatesLoading is true', () => { @@ -75,9 +76,9 @@ describe('AdvancedTabContent Component', function () { const feeChartDiv = advancedTabChildren.at(1) assert(feeChartDiv.childAt(0).hasClass('advanced-tab__gas-edit-rows')) - assert(feeChartDiv.childAt(1).hasClass('advanced-tab__fee-chart__title')) - assert(feeChartDiv.childAt(2).is(Loading)) - assert(feeChartDiv.childAt(3).hasClass('advanced-tab__fee-chart__speed-buttons')) + assert(feeChartDiv.childAt(1).childAt(0).hasClass('advanced-tab__fee-chart__title')) + assert(feeChartDiv.childAt(1).childAt(1).is(Loading)) + assert(feeChartDiv.childAt(1).childAt(2).hasClass('advanced-tab__fee-chart__speed-buttons')) }) it('should call renderDataSummary with the expected params', () => { diff --git a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.js similarity index 100% rename from ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.js diff --git a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.scss b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.scss similarity index 100% rename from ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.scss rename to ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.scss diff --git a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/tests/time-remaining-component.test.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/tests/time-remaining-component.test.js similarity index 92% rename from ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/tests/time-remaining-component.test.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/tests/time-remaining-component.test.js index d8490272ff76..17f0345d583b 100644 --- a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/tests/time-remaining-component.test.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/tests/time-remaining-component.test.js @@ -1,6 +1,6 @@ import React from 'react' import assert from 'assert' -import shallow from '../../../../../../../lib/shallow-with-context' +import shallow from '../../../../../../../../lib/shallow-with-context' import TimeRemaining from '../time-remaining.component.js' describe('TimeRemaining Component', function () { diff --git a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.component.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.component.js similarity index 100% rename from ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.component.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.component.js diff --git a/ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.utils.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.utils.js similarity index 100% rename from ui/app/components/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.utils.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.utils.js diff --git a/ui/app/components/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content.component.js b/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content.component.js similarity index 95% rename from ui/app/components/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content.component.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content.component.js index 05b8f700b09f..5f3925fa51b9 100644 --- a/ui/app/components/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content.component.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content.component.js @@ -1,6 +1,6 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import Loading from '../../../loading-screen' +import Loading from '../../../../ui/loading-screen' import GasPriceButtonGroup from '../../gas-price-button-group' export default class BasicTabContent extends Component { diff --git a/ui/app/components/gas-customization/gas-modal-page-container/basic-tab-content/index.js b/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/index.js similarity index 100% rename from ui/app/components/gas-customization/gas-modal-page-container/basic-tab-content/index.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/index.js diff --git a/ui/app/components/gas-customization/gas-modal-page-container/basic-tab-content/index.scss b/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/index.scss similarity index 100% rename from ui/app/components/gas-customization/gas-modal-page-container/basic-tab-content/index.scss rename to ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/index.scss diff --git a/ui/app/components/gas-customization/gas-modal-page-container/basic-tab-content/tests/basic-tab-content-component.test.js b/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/tests/basic-tab-content-component.test.js similarity index 95% rename from ui/app/components/gas-customization/gas-modal-page-container/basic-tab-content/tests/basic-tab-content-component.test.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/tests/basic-tab-content-component.test.js index 47864fcabeee..0989ac6770be 100644 --- a/ui/app/components/gas-customization/gas-modal-page-container/basic-tab-content/tests/basic-tab-content-component.test.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/tests/basic-tab-content-component.test.js @@ -1,10 +1,10 @@ import React from 'react' import assert from 'assert' -import shallow from '../../../../../../lib/shallow-with-context' +import shallow from '../../../../../../../lib/shallow-with-context' import BasicTabContent from '../basic-tab-content.component' -import GasPriceButtonGroup from '../../../gas-price-button-group/' -import Loading from '../../../../loading-screen' +import GasPriceButtonGroup from '../../../gas-price-button-group' +import Loading from '../../../../../ui/loading-screen' const mockGasPriceButtonGroupProps = { buttonDataLoading: false, diff --git a/ui/app/components/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js b/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js similarity index 97% rename from ui/app/components/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js index 174bd8ea8c53..d242f59f5eb2 100644 --- a/ui/app/components/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import PageContainer from '../../page-container' -import { Tabs, Tab } from '../../tabs' +import PageContainer from '../../../ui/page-container' +import { Tabs, Tab } from '../../../ui/tabs' import AdvancedTabContent from './advanced-tab-content' import BasicTabContent from './basic-tab-content' @@ -177,7 +177,7 @@ export default class GasModalPageContainer extends Component { onSubmit(customModalGasLimitInHex, customModalGasPriceInHex) }} submitText={this.context.t('save')} - headerCloseText={'Close'} + headerCloseText={this.context.t('close')} hideCancel={true} /> diff --git a/ui/app/components/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js b/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js similarity index 94% rename from ui/app/components/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js index 6692fb363de7..d541056f4b38 100644 --- a/ui/app/components/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js @@ -7,7 +7,7 @@ import { setGasPrice, createSpeedUpTransaction, hideSidebar, -} from '../../../actions' +} from '../../../../store/actions' import { setCustomGasPrice, setCustomGasLimit, @@ -15,19 +15,22 @@ import { setCustomTimeEstimate, fetchGasEstimates, fetchBasicGasAndTimeEstimates, -} from '../../../ducks/gas.duck' +} from '../../../../ducks/gas/gas.duck' import { hideGasButtonGroup, -} from '../../../ducks/send.duck' +} from '../../../../ducks/send/send.duck' import { updateGasAndCalculate, -} from '../../../ducks/confirm-transaction.duck' +} from '../../../../ducks/confirm-transaction/confirm-transaction.duck' import { - getCurrentCurrency, conversionRateSelector as getConversionRate, - getSelectedToken, + getCurrentCurrency, getCurrentEthBalance, -} from '../../../selectors.js' + getIsMainnet, + getSelectedToken, + isEthereumNetwork, + preferencesSelector, +} from '../../../../selectors/selectors.js' import { formatTimeEstimate, getFastPriceEstimateInHexWEI, @@ -41,29 +44,28 @@ import { getRenderableBasicEstimateData, getBasicGasEstimateBlockTime, isCustomPriceSafe, -} from '../../../selectors/custom-gas' +} from '../../../../selectors/custom-gas' import { submittedPendingTransactionsSelector, -} from '../../../selectors/transactions' +} from '../../../../selectors/transactions' import { formatCurrency, -} from '../../../helpers/confirm-transaction/util' +} from '../../../../helpers/utils/confirm-tx.util' import { addHexWEIsToDec, decEthToConvertedCurrency as ethTotalToConvertedCurrency, decGWEIToHexWEI, hexWEIToDecGWEI, -} from '../../../helpers/conversions.util' +} from '../../../../helpers/utils/conversions.util' import { formatETHFee, -} from '../../../helpers/formatters' +} from '../../../../helpers/utils/formatters' import { calcGasTotal, isBalanceSufficient, } from '../../send/send.utils' import { addHexPrefix } from 'ethereumjs-util' import { getAdjacentGasPrices, extrapolateY } from '../gas-price-chart/gas-price-chart.utils' -import {getIsMainnet, preferencesSelector} from '../../../selectors' const mapStateToProps = (state, ownProps) => { const { transaction = {} } = ownProps @@ -138,6 +140,8 @@ const mapStateToProps = (state, ownProps) => { txId: transaction.id, insufficientBalance, gasEstimatesLoading, + isMainnet, + isEthereumNetwork: isEthereumNetwork(state), } } diff --git a/ui/app/components/gas-customization/gas-modal-page-container/index.js b/ui/app/components/app/gas-customization/gas-modal-page-container/index.js similarity index 100% rename from ui/app/components/gas-customization/gas-modal-page-container/index.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/index.js diff --git a/ui/app/components/gas-customization/gas-modal-page-container/index.scss b/ui/app/components/app/gas-customization/gas-modal-page-container/index.scss similarity index 100% rename from ui/app/components/gas-customization/gas-modal-page-container/index.scss rename to ui/app/components/app/gas-customization/gas-modal-page-container/index.scss diff --git a/ui/app/components/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-component.test.js b/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-component.test.js similarity index 97% rename from ui/app/components/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-component.test.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-component.test.js index 1761ad2b0b7f..7557eefe5419 100644 --- a/ui/app/components/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-component.test.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-component.test.js @@ -1,13 +1,13 @@ import React from 'react' import assert from 'assert' -import shallow from '../../../../../lib/shallow-with-context' +import shallow from '../../../../../../lib/shallow-with-context' import sinon from 'sinon' import GasModalPageContainer from '../gas-modal-page-container.component.js' -import timeout from '../../../../../lib/test-timeout' +import timeout from '../../../../../../lib/test-timeout' -import PageContainer from '../../../page-container' +import PageContainer from '../../../../ui/page-container' -import { Tab } from '../../../tabs' +import { Tab } from '../../../../ui/tabs' const mockBasicGasEstimates = { blockTime: 'mockBlockTime', diff --git a/ui/app/components/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js b/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js similarity index 96% rename from ui/app/components/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js rename to ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js index fb6a01fff060..b9eb67d2bd38 100644 --- a/ui/app/components/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js @@ -35,16 +35,16 @@ proxyquire('../gas-modal-page-container.container.js', { return () => ({}) }, }, - '../../../selectors/custom-gas': { + '../../../../selectors/custom-gas': { getBasicGasEstimateLoadingStatus: (s) => `mockBasicGasEstimateLoadingStatus:${Object.keys(s).length}`, getRenderableBasicEstimateData: (s) => `mockRenderableBasicEstimateData:${Object.keys(s).length}`, getDefaultActiveButtonIndex: (a, b) => a + b, }, - '../../../actions': actionSpies, - '../../../ducks/gas.duck': gasActionSpies, - '../../../ducks/confirm-transaction.duck': confirmTransactionActionSpies, - '../../../ducks/send.duck': sendActionSpies, - '../../../selectors.js': { + '../../../../store/actions': actionSpies, + '../../../../ducks/gas/gas.duck': gasActionSpies, + '../../../../ducks/confirm-transaction/confirm-transaction.duck': confirmTransactionActionSpies, + '../../../../ducks/send/send.duck': sendActionSpies, + '../../../../selectors/selectors.js': { getCurrentEthBalance: (state) => state.metamask.balance || '0x0', }, }) @@ -118,7 +118,7 @@ describe('gas-modal-page-container container', () => { gasChartProps: { 'currentPrice': 4.294967295, estimatedTimes: [31, 62, 93, 124], - estimatedTimesMax: '31', + estimatedTimesMax: 31, gasPrices: [3, 4, 5, 6], gasPricesMax: 6, }, @@ -140,6 +140,8 @@ describe('gas-modal-page-container container', () => { insufficientBalance: true, isSpeedUp: false, txId: 34, + isEthereumNetwork: false, + isMainnet: true, } const baseMockOwnProps = { transaction: { id: 34 } } const tests = [ @@ -179,6 +181,7 @@ describe('gas-modal-page-container container', () => { ...baseExpectedResult.infoRowProps, newTotalFiat: '', }, + isMainnet: false, }, }, { @@ -196,7 +199,10 @@ describe('gas-modal-page-container container', () => { }, }), mockOwnProps: baseMockOwnProps, - expectedResult: baseExpectedResult, + expectedResult: { + ...baseExpectedResult, + isMainnet: false, + }, }, { mockState: Object.assign({}, baseMockState, { diff --git a/ui/app/components/gas-customization/gas-price-button-group/gas-price-button-group.component.js b/ui/app/components/app/gas-customization/gas-price-button-group/gas-price-button-group.component.js similarity index 96% rename from ui/app/components/gas-customization/gas-price-button-group/gas-price-button-group.component.js rename to ui/app/components/app/gas-customization/gas-price-button-group/gas-price-button-group.component.js index 8ad063b21c49..0456f5262c08 100644 --- a/ui/app/components/gas-customization/gas-price-button-group/gas-price-button-group.component.js +++ b/ui/app/components/app/gas-customization/gas-price-button-group/gas-price-button-group.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import ButtonGroup from '../../button-group' -import Button from '../../button' +import ButtonGroup from '../../../ui/button-group' +import Button from '../../../ui/button' const GAS_OBJECT_PROPTYPES_SHAPE = { label: PropTypes.string, diff --git a/ui/app/components/gas-customization/gas-price-button-group/index.js b/ui/app/components/app/gas-customization/gas-price-button-group/index.js similarity index 100% rename from ui/app/components/gas-customization/gas-price-button-group/index.js rename to ui/app/components/app/gas-customization/gas-price-button-group/index.js diff --git a/ui/app/components/gas-customization/gas-price-button-group/index.scss b/ui/app/components/app/gas-customization/gas-price-button-group/index.scss similarity index 100% rename from ui/app/components/gas-customization/gas-price-button-group/index.scss rename to ui/app/components/app/gas-customization/gas-price-button-group/index.scss diff --git a/ui/app/components/gas-customization/gas-price-button-group/tests/gas-price-button-group-component.test.js b/ui/app/components/app/gas-customization/gas-price-button-group/tests/gas-price-button-group-component.test.js similarity index 98% rename from ui/app/components/gas-customization/gas-price-button-group/tests/gas-price-button-group-component.test.js rename to ui/app/components/app/gas-customization/gas-price-button-group/tests/gas-price-button-group-component.test.js index 79f74f8e40b8..37840a8a54a9 100644 --- a/ui/app/components/gas-customization/gas-price-button-group/tests/gas-price-button-group-component.test.js +++ b/ui/app/components/app/gas-customization/gas-price-button-group/tests/gas-price-button-group-component.test.js @@ -1,10 +1,10 @@ import React from 'react' import assert from 'assert' -import shallow from '../../../../../lib/shallow-with-context' +import shallow from '../../../../../../lib/shallow-with-context' import sinon from 'sinon' import GasPriceButtonGroup from '../gas-price-button-group.component' -import ButtonGroup from '../../../button-group/' +import ButtonGroup from '../../../../ui/button-group' const mockGasPriceButtonGroupProps = { buttonDataLoading: false, diff --git a/ui/app/components/gas-customization/gas-price-chart/gas-price-chart.component.js b/ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.component.js similarity index 100% rename from ui/app/components/gas-customization/gas-price-chart/gas-price-chart.component.js rename to ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.component.js diff --git a/ui/app/components/gas-customization/gas-price-chart/gas-price-chart.utils.js b/ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.utils.js similarity index 100% rename from ui/app/components/gas-customization/gas-price-chart/gas-price-chart.utils.js rename to ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.utils.js diff --git a/ui/app/components/gas-customization/gas-price-chart/index.js b/ui/app/components/app/gas-customization/gas-price-chart/index.js similarity index 100% rename from ui/app/components/gas-customization/gas-price-chart/index.js rename to ui/app/components/app/gas-customization/gas-price-chart/index.js diff --git a/ui/app/components/gas-customization/gas-price-chart/index.scss b/ui/app/components/app/gas-customization/gas-price-chart/index.scss similarity index 100% rename from ui/app/components/gas-customization/gas-price-chart/index.scss rename to ui/app/components/app/gas-customization/gas-price-chart/index.scss diff --git a/ui/app/components/gas-customization/gas-price-chart/tests/gas-price-chart.component.test.js b/ui/app/components/app/gas-customization/gas-price-chart/tests/gas-price-chart.component.test.js similarity index 99% rename from ui/app/components/gas-customization/gas-price-chart/tests/gas-price-chart.component.test.js rename to ui/app/components/app/gas-customization/gas-price-chart/tests/gas-price-chart.component.test.js index 74eddae421d8..7dec7a85fcbc 100644 --- a/ui/app/components/gas-customization/gas-price-chart/tests/gas-price-chart.component.test.js +++ b/ui/app/components/app/gas-customization/gas-price-chart/tests/gas-price-chart.component.test.js @@ -2,7 +2,7 @@ import React from 'react' import assert from 'assert' import proxyquire from 'proxyquire' import sinon from 'sinon' -import shallow from '../../../../../lib/shallow-with-context' +import shallow from '../../../../../../lib/shallow-with-context' import * as d3 from 'd3' function timeout (time) { diff --git a/ui/app/components/gas-customization/gas-slider/gas-slider.component.js b/ui/app/components/app/gas-customization/gas-slider/gas-slider.component.js similarity index 100% rename from ui/app/components/gas-customization/gas-slider/gas-slider.component.js rename to ui/app/components/app/gas-customization/gas-slider/gas-slider.component.js diff --git a/ui/app/components/gas-customization/gas-slider/index.js b/ui/app/components/app/gas-customization/gas-slider/index.js similarity index 100% rename from ui/app/components/gas-customization/gas-slider/index.js rename to ui/app/components/app/gas-customization/gas-slider/index.js diff --git a/ui/app/components/gas-customization/gas-slider/index.scss b/ui/app/components/app/gas-customization/gas-slider/index.scss similarity index 100% rename from ui/app/components/gas-customization/gas-slider/index.scss rename to ui/app/components/app/gas-customization/gas-slider/index.scss diff --git a/ui/app/components/gas-customization/gas.selectors.js b/ui/app/components/app/gas-customization/gas.selectors.js similarity index 100% rename from ui/app/components/gas-customization/gas.selectors.js rename to ui/app/components/app/gas-customization/gas.selectors.js diff --git a/ui/app/components/gas-customization/index.scss b/ui/app/components/app/gas-customization/index.scss similarity index 100% rename from ui/app/components/gas-customization/index.scss rename to ui/app/components/app/gas-customization/index.scss diff --git a/ui/app/components/app/index.scss b/ui/app/components/app/index.scss new file mode 100644 index 000000000000..e9bb4ac9f2b8 --- /dev/null +++ b/ui/app/components/app/index.scss @@ -0,0 +1,81 @@ +@import 'account-menu/index'; + +@import 'add-token-button/index'; + +@import 'app-header/index'; + +@import '../ui/breadcrumbs/index'; + +@import '../ui/button-group/index'; + +@import '../ui/card/index'; + +@import 'confirm-page-container/index'; + +@import '../ui/currency-input/index'; + +@import '../ui/currency-display/index'; + +@import '../ui/error-message/index'; + +@import '../ui/export-text-container/index'; + +@import '../ui/identicon/index'; + +@import 'info-box/index'; + +@import 'menu-bar/index'; + +@import 'modal/index'; + +@import 'modals/index'; + +@import 'network-display/index'; + +@import '../ui/page-container/index'; + +@import '../../pages/index'; + +@import 'provider-page-container/index'; + +@import 'selected-account/index'; + +@import '../ui/sender-to-recipient/index'; + +@import '../ui/tabs/index'; + +@import '../ui/token-balance/index'; + +@import 'transaction-activity-log/index'; + +@import 'transaction-breakdown/index'; + +@import 'transaction-view/index'; + +@import 'transaction-view-balance/index'; + +@import 'transaction-list/index'; + +@import 'transaction-list-item/index'; + +@import 'transaction-list-item-details/index'; + +@import 'transaction-status/index'; + +@import 'app-header/index'; + +@import 'sidebars/index'; + +@import '../ui/unit-input/index'; + +@import 'gas-customization/gas-modal-page-container/index'; + +@import 'gas-customization/gas-modal-page-container/index'; + +@import 'gas-customization/gas-modal-page-container/index'; + +@import 'gas-customization/index'; + +@import 'gas-customization/gas-price-button-group/index'; + +@import 'ui-migration-annoucement/index'; diff --git a/ui/app/components/info-box/index.js b/ui/app/components/app/info-box/index.js similarity index 100% rename from ui/app/components/info-box/index.js rename to ui/app/components/app/info-box/index.js diff --git a/ui/app/components/info-box/index.scss b/ui/app/components/app/info-box/index.scss similarity index 100% rename from ui/app/components/info-box/index.scss rename to ui/app/components/app/info-box/index.scss diff --git a/ui/app/components/info-box/info-box.component.js b/ui/app/components/app/info-box/info-box.component.js similarity index 100% rename from ui/app/components/info-box/info-box.component.js rename to ui/app/components/app/info-box/info-box.component.js diff --git a/ui/app/components/input-number.js b/ui/app/components/app/input-number.js similarity index 97% rename from ui/app/components/input-number.js rename to ui/app/components/app/input-number.js index eec5e3740b95..8a6ec725c386 100644 --- a/ui/app/components/input-number.js +++ b/ui/app/components/app/input-number.js @@ -6,7 +6,7 @@ const { conversionGTE, conversionLTE, subtractCurrencies, -} = require('../conversion-util') +} = require('../../helpers/utils/conversion-util') module.exports = InputNumber diff --git a/ui/app/components/loading-network-screen/index.js b/ui/app/components/app/loading-network-screen/index.js similarity index 100% rename from ui/app/components/loading-network-screen/index.js rename to ui/app/components/app/loading-network-screen/index.js diff --git a/ui/app/components/loading-network-screen/loading-network-screen.component.js b/ui/app/components/app/loading-network-screen/loading-network-screen.component.js similarity index 98% rename from ui/app/components/loading-network-screen/loading-network-screen.component.js rename to ui/app/components/app/loading-network-screen/loading-network-screen.component.js index bf1c141e0975..348a997c82c1 100644 --- a/ui/app/components/loading-network-screen/loading-network-screen.component.js +++ b/ui/app/components/app/loading-network-screen/loading-network-screen.component.js @@ -1,7 +1,7 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import Spinner from '../spinner' -import Button from '../button' +import Spinner from '../../ui/spinner' +import Button from '../../ui/button' export default class LoadingNetworkScreen extends PureComponent { state = { diff --git a/ui/app/components/loading-network-screen/loading-network-screen.container.js b/ui/app/components/app/loading-network-screen/loading-network-screen.container.js similarity index 89% rename from ui/app/components/loading-network-screen/loading-network-screen.container.js rename to ui/app/components/app/loading-network-screen/loading-network-screen.container.js index d0623e574621..87f1397ce5b6 100644 --- a/ui/app/components/loading-network-screen/loading-network-screen.container.js +++ b/ui/app/components/app/loading-network-screen/loading-network-screen.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import LoadingNetworkScreen from './loading-network-screen.component' -import actions from '../../actions' -import { getNetworkIdentifier } from '../../selectors' +import actions from '../../../store/actions' +import { getNetworkIdentifier } from '../../../selectors/selectors' const mapStateToProps = state => { const { diff --git a/ui/app/components/menu-bar/index.js b/ui/app/components/app/menu-bar/index.js similarity index 100% rename from ui/app/components/menu-bar/index.js rename to ui/app/components/app/menu-bar/index.js diff --git a/ui/app/components/menu-bar/index.scss b/ui/app/components/app/menu-bar/index.scss similarity index 100% rename from ui/app/components/menu-bar/index.scss rename to ui/app/components/app/menu-bar/index.scss diff --git a/ui/app/components/menu-bar/menu-bar.component.js b/ui/app/components/app/menu-bar/menu-bar.component.js similarity index 64% rename from ui/app/components/menu-bar/menu-bar.component.js rename to ui/app/components/app/menu-bar/menu-bar.component.js index dfc977d3ca45..e37fddda4b3f 100644 --- a/ui/app/components/menu-bar/menu-bar.component.js +++ b/ui/app/components/app/menu-bar/menu-bar.component.js @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import Tooltip from '../tooltip' +import Tooltip from '../../ui/tooltip' import SelectedAccount from '../selected-account' import AccountDetailsDropdown from '../dropdowns/account-details-dropdown.js' @@ -12,7 +12,6 @@ export default class MenuBar extends PureComponent { static propTypes = { hideSidebar: PropTypes.func, - isMascara: PropTypes.bool, sidebarOpen: PropTypes.bool, showSidebar: PropTypes.func, } @@ -21,7 +20,7 @@ export default class MenuBar extends PureComponent { render () { const { t } = this.context - const { isMascara, sidebarOpen, hideSidebar, showSidebar } = this.props + const { sidebarOpen, hideSidebar, showSidebar } = this.props const { accountDetailsMenuOpen } = this.state return ( @@ -45,29 +44,27 @@ export default class MenuBar extends PureComponent { /> - { - !isMascara && ( - -
{ - this.context.metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Home', - name: 'Opened Account Options', - }, - }) - this.setState({ accountDetailsMenuOpen: true }) - }} - > -
-
- ) - } + + +
{ + this.context.metricsEvent({ + eventOpts: { + category: 'Navigation', + action: 'Home', + name: 'Opened Account Options', + }, + }) + this.setState({ accountDetailsMenuOpen: true }) + }} + > +
+
+ { accountDetailsMenuOpen && ( { - const { appState: { sidebar: { isOpen }, isMascara } } = state + const { appState: { sidebar: { isOpen } } } = state return { sidebarOpen: isOpen, - isMascara, } } diff --git a/ui/app/components/menu-droppo.js b/ui/app/components/app/menu-droppo.js similarity index 100% rename from ui/app/components/menu-droppo.js rename to ui/app/components/app/menu-droppo.js diff --git a/ui/app/components/modal/index.js b/ui/app/components/app/modal/index.js similarity index 100% rename from ui/app/components/modal/index.js rename to ui/app/components/app/modal/index.js diff --git a/ui/app/components/modal/index.scss b/ui/app/components/app/modal/index.scss similarity index 96% rename from ui/app/components/modal/index.scss rename to ui/app/components/app/modal/index.scss index 2beb146330cf..ec67d15fd357 100644 --- a/ui/app/components/modal/index.scss +++ b/ui/app/components/app/modal/index.scss @@ -1,4 +1,4 @@ -@import './modal-content/index'; +@import 'modal-content/index'; .modal-container { width: 100%; diff --git a/ui/app/components/modal/modal-content/index.js b/ui/app/components/app/modal/modal-content/index.js similarity index 100% rename from ui/app/components/modal/modal-content/index.js rename to ui/app/components/app/modal/modal-content/index.js diff --git a/ui/app/components/modal/modal-content/index.scss b/ui/app/components/app/modal/modal-content/index.scss similarity index 100% rename from ui/app/components/modal/modal-content/index.scss rename to ui/app/components/app/modal/modal-content/index.scss diff --git a/ui/app/components/modal/modal-content/modal-content.component.js b/ui/app/components/app/modal/modal-content/modal-content.component.js similarity index 100% rename from ui/app/components/modal/modal-content/modal-content.component.js rename to ui/app/components/app/modal/modal-content/modal-content.component.js diff --git a/ui/app/components/modal/modal-content/tests/modal-content.component.test.js b/ui/app/components/app/modal/modal-content/tests/modal-content.component.test.js similarity index 100% rename from ui/app/components/modal/modal-content/tests/modal-content.component.test.js rename to ui/app/components/app/modal/modal-content/tests/modal-content.component.test.js diff --git a/ui/app/components/modal/modal.component.js b/ui/app/components/app/modal/modal.component.js similarity index 98% rename from ui/app/components/modal/modal.component.js rename to ui/app/components/app/modal/modal.component.js index c73f8d903ca3..49e131b3cbea 100644 --- a/ui/app/components/modal/modal.component.js +++ b/ui/app/components/app/modal/modal.component.js @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import Button from '../button' +import Button from '../../ui/button' export default class Modal extends PureComponent { static propTypes = { diff --git a/ui/app/components/modal/tests/modal.component.test.js b/ui/app/components/app/modal/tests/modal.component.test.js similarity index 98% rename from ui/app/components/modal/tests/modal.component.test.js rename to ui/app/components/app/modal/tests/modal.component.test.js index 2ced3f32d042..a13d7c06a561 100644 --- a/ui/app/components/modal/tests/modal.component.test.js +++ b/ui/app/components/app/modal/tests/modal.component.test.js @@ -3,7 +3,7 @@ import assert from 'assert' import { mount, shallow } from 'enzyme' import sinon from 'sinon' import Modal from '../modal.component' -import Button from '../../button' +import Button from '../../../ui/button' describe('Modal Component', () => { it('should render a modal with a submit button', () => { diff --git a/ui/app/components/modals/account-details-modal.js b/ui/app/components/app/modals/account-details-modal.js similarity index 88% rename from ui/app/components/modals/account-details-modal.js rename to ui/app/components/app/modals/account-details-modal.js index 67d8eb0fdaaf..94ed04df99b9 100644 --- a/ui/app/components/modals/account-details-modal.js +++ b/ui/app/components/app/modals/account-details-modal.js @@ -3,14 +3,14 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect -const actions = require('../../actions') +const actions = require('../../../store/actions') const AccountModalContainer = require('./account-modal-container') -const { getSelectedIdentity } = require('../../selectors') -const genAccountLink = require('../../../lib/account-link.js') -const QrView = require('../qr-code') -const EditableLabel = require('../editable-label') +const { getSelectedIdentity } = require('../../../selectors/selectors') +const genAccountLink = require('../../../../lib/account-link.js') +const QrView = require('../../ui/qr-code') +const EditableLabel = require('../../ui/editable-label') -import Button from '../button' +import Button from '../../ui/button' function mapStateToProps (state) { return { diff --git a/ui/app/components/modals/account-modal-container.js b/ui/app/components/app/modals/account-modal-container.js similarity index 90% rename from ui/app/components/modals/account-modal-container.js rename to ui/app/components/app/modals/account-modal-container.js index 2a6c655e1910..b7ae0b5b87a3 100644 --- a/ui/app/components/modals/account-modal-container.js +++ b/ui/app/components/app/modals/account-modal-container.js @@ -3,9 +3,9 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect -const actions = require('../../actions') -const { getSelectedIdentity } = require('../../selectors') -import Identicon from '../identicon' +const actions = require('../../../store/actions') +const { getSelectedIdentity } = require('../../../selectors/selectors') +import Identicon from '../../ui/identicon' function mapStateToProps (state, ownProps) { return { diff --git a/ui/app/components/modals/buy-options-modal.js b/ui/app/components/app/modals/buy-options-modal.js similarity index 95% rename from ui/app/components/modals/buy-options-modal.js rename to ui/app/components/app/modals/buy-options-modal.js index c70510b5fcde..2df20e65c41b 100644 --- a/ui/app/components/modals/buy-options-modal.js +++ b/ui/app/components/app/modals/buy-options-modal.js @@ -3,8 +3,8 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect -const actions = require('../../actions') -const { getNetworkDisplayName } = require('../../../../app/scripts/controllers/network/util') +const actions = require('../../../store/actions') +const { getNetworkDisplayName } = require('../../../../../app/scripts/controllers/network/util') function mapStateToProps (state) { return { diff --git a/ui/app/components/modals/cancel-transaction/cancel-transaction-gas-fee/cancel-transaction-gas-fee.component.js b/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/cancel-transaction-gas-fee.component.js similarity index 90% rename from ui/app/components/modals/cancel-transaction/cancel-transaction-gas-fee/cancel-transaction-gas-fee.component.js rename to ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/cancel-transaction-gas-fee.component.js index b973f221ce6c..beebb7ed76da 100644 --- a/ui/app/components/modals/cancel-transaction/cancel-transaction-gas-fee/cancel-transaction-gas-fee.component.js +++ b/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/cancel-transaction-gas-fee.component.js @@ -1,7 +1,7 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import UserPreferencedCurrencyDisplay from '../../../user-preferenced-currency-display' -import { PRIMARY, SECONDARY } from '../../../../constants/common' +import { PRIMARY, SECONDARY } from '../../../../../helpers/constants/common' export default class CancelTransaction extends PureComponent { static propTypes = { diff --git a/ui/app/components/modals/cancel-transaction/cancel-transaction-gas-fee/index.js b/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/index.js similarity index 100% rename from ui/app/components/modals/cancel-transaction/cancel-transaction-gas-fee/index.js rename to ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/index.js diff --git a/ui/app/components/modals/cancel-transaction/cancel-transaction-gas-fee/index.scss b/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/index.scss similarity index 100% rename from ui/app/components/modals/cancel-transaction/cancel-transaction-gas-fee/index.scss rename to ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/index.scss diff --git a/ui/app/components/modals/cancel-transaction/cancel-transaction-gas-fee/tests/cancel-transaction-gas-fee.component.test.js b/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/tests/cancel-transaction-gas-fee.component.test.js similarity index 100% rename from ui/app/components/modals/cancel-transaction/cancel-transaction-gas-fee/tests/cancel-transaction-gas-fee.component.test.js rename to ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/tests/cancel-transaction-gas-fee.component.test.js diff --git a/ui/app/components/modals/cancel-transaction/cancel-transaction.component.js b/ui/app/components/app/modals/cancel-transaction/cancel-transaction.component.js similarity index 96% rename from ui/app/components/modals/cancel-transaction/cancel-transaction.component.js rename to ui/app/components/app/modals/cancel-transaction/cancel-transaction.component.js index 8fd7b2679540..6bab5ec1fbe8 100644 --- a/ui/app/components/modals/cancel-transaction/cancel-transaction.component.js +++ b/ui/app/components/app/modals/cancel-transaction/cancel-transaction.component.js @@ -2,7 +2,7 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import Modal from '../../modal' import CancelTransactionGasFee from './cancel-transaction-gas-fee' -import { SUBMITTED_STATUS } from '../../../constants/transactions' +import { SUBMITTED_STATUS } from '../../../../helpers/constants/transactions' export default class CancelTransaction extends PureComponent { static contextTypes = { diff --git a/ui/app/components/modals/cancel-transaction/cancel-transaction.container.js b/ui/app/components/app/modals/cancel-transaction/cancel-transaction.container.js similarity index 84% rename from ui/app/components/modals/cancel-transaction/cancel-transaction.container.js rename to ui/app/components/app/modals/cancel-transaction/cancel-transaction.container.js index 10931a001039..6959889d9192 100644 --- a/ui/app/components/modals/cancel-transaction/cancel-transaction.container.js +++ b/ui/app/components/app/modals/cancel-transaction/cancel-transaction.container.js @@ -1,11 +1,11 @@ import { connect } from 'react-redux' import { compose } from 'recompose' import ethUtil from 'ethereumjs-util' -import { multiplyCurrencies } from '../../../conversion-util' -import withModalProps from '../../../higher-order-components/with-modal-props' +import { multiplyCurrencies } from '../../../../helpers/utils/conversion-util' +import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' import CancelTransaction from './cancel-transaction.component' -import { showModal, createCancelTransaction } from '../../../actions' -import { getHexGasTotal } from '../../../helpers/confirm-transaction/util' +import { showModal, createCancelTransaction } from '../../../../store/actions' +import { getHexGasTotal } from '../../../../helpers/utils/confirm-tx.util' const mapStateToProps = (state, ownProps) => { const { metamask } = state diff --git a/ui/app/components/modals/cancel-transaction/index.js b/ui/app/components/app/modals/cancel-transaction/index.js similarity index 100% rename from ui/app/components/modals/cancel-transaction/index.js rename to ui/app/components/app/modals/cancel-transaction/index.js diff --git a/ui/app/components/modals/cancel-transaction/index.scss b/ui/app/components/app/modals/cancel-transaction/index.scss similarity index 84% rename from ui/app/components/modals/cancel-transaction/index.scss rename to ui/app/components/app/modals/cancel-transaction/index.scss index 62e8e36fd31a..4ffb5a0f892c 100644 --- a/ui/app/components/modals/cancel-transaction/index.scss +++ b/ui/app/components/app/modals/cancel-transaction/index.scss @@ -1,4 +1,4 @@ -@import './cancel-transaction-gas-fee/index'; +@import 'cancel-transaction-gas-fee/index'; .cancel-transaction { &__title { @@ -15,4 +15,4 @@ &__cancel-transaction-gas-fee-container { margin-bottom: 16px; } -} \ No newline at end of file +} diff --git a/ui/app/components/modals/cancel-transaction/tests/cancel-transaction.component.test.js b/ui/app/components/app/modals/cancel-transaction/tests/cancel-transaction.component.test.js similarity index 100% rename from ui/app/components/modals/cancel-transaction/tests/cancel-transaction.component.test.js rename to ui/app/components/app/modals/cancel-transaction/tests/cancel-transaction.component.test.js diff --git a/ui/app/components/modals/clear-approved-origins/clear-approved-origins.component.js b/ui/app/components/app/modals/clear-approved-origins/clear-approved-origins.component.js similarity index 100% rename from ui/app/components/modals/clear-approved-origins/clear-approved-origins.component.js rename to ui/app/components/app/modals/clear-approved-origins/clear-approved-origins.component.js diff --git a/ui/app/components/modals/clear-approved-origins/clear-approved-origins.container.js b/ui/app/components/app/modals/clear-approved-origins/clear-approved-origins.container.js similarity index 71% rename from ui/app/components/modals/clear-approved-origins/clear-approved-origins.container.js rename to ui/app/components/app/modals/clear-approved-origins/clear-approved-origins.container.js index 3a801a06214b..2276bc7e7822 100644 --- a/ui/app/components/modals/clear-approved-origins/clear-approved-origins.container.js +++ b/ui/app/components/app/modals/clear-approved-origins/clear-approved-origins.container.js @@ -1,8 +1,8 @@ import { connect } from 'react-redux' import { compose } from 'recompose' -import withModalProps from '../../../higher-order-components/with-modal-props' +import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' import ClearApprovedOriginsComponent from './clear-approved-origins.component' -import { clearApprovedOrigins } from '../../../actions' +import { clearApprovedOrigins } from '../../../../store/actions' const mapDispatchToProps = dispatch => { return { diff --git a/ui/app/components/modals/clear-approved-origins/index.js b/ui/app/components/app/modals/clear-approved-origins/index.js similarity index 100% rename from ui/app/components/modals/clear-approved-origins/index.js rename to ui/app/components/app/modals/clear-approved-origins/index.js diff --git a/ui/app/components/modals/confirm-remove-account/confirm-remove-account.component.js b/ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.component.js similarity index 93% rename from ui/app/components/modals/confirm-remove-account/confirm-remove-account.component.js rename to ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.component.js index 195c5542175b..f35fb85a01d9 100644 --- a/ui/app/components/modals/confirm-remove-account/confirm-remove-account.component.js +++ b/ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.component.js @@ -1,9 +1,9 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import Modal from '../../modal' -import { addressSummary } from '../../../util' -import Identicon from '../../identicon' -import genAccountLink from '../../../../lib/account-link' +import { addressSummary } from '../../../../helpers/utils/util' +import Identicon from '../../../ui/identicon' +import genAccountLink from '../../../../../lib/account-link' export default class ConfirmRemoveAccount extends Component { static propTypes = { diff --git a/ui/app/components/modals/confirm-remove-account/confirm-remove-account.container.js b/ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.container.js similarity index 76% rename from ui/app/components/modals/confirm-remove-account/confirm-remove-account.container.js rename to ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.container.js index 45c6654ab015..0a3cda5b6f47 100644 --- a/ui/app/components/modals/confirm-remove-account/confirm-remove-account.container.js +++ b/ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.container.js @@ -1,8 +1,8 @@ import { connect } from 'react-redux' import { compose } from 'recompose' import ConfirmRemoveAccount from './confirm-remove-account.component' -import withModalProps from '../../../higher-order-components/with-modal-props' -import { removeAccount } from '../../../actions' +import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' +import { removeAccount } from '../../../../store/actions' const mapStateToProps = state => { return { diff --git a/ui/app/components/modals/confirm-remove-account/index.js b/ui/app/components/app/modals/confirm-remove-account/index.js similarity index 100% rename from ui/app/components/modals/confirm-remove-account/index.js rename to ui/app/components/app/modals/confirm-remove-account/index.js diff --git a/ui/app/components/modals/confirm-remove-account/index.scss b/ui/app/components/app/modals/confirm-remove-account/index.scss similarity index 100% rename from ui/app/components/modals/confirm-remove-account/index.scss rename to ui/app/components/app/modals/confirm-remove-account/index.scss diff --git a/ui/app/components/modals/confirm-reset-account/confirm-reset-account.component.js b/ui/app/components/app/modals/confirm-reset-account/confirm-reset-account.component.js similarity index 100% rename from ui/app/components/modals/confirm-reset-account/confirm-reset-account.component.js rename to ui/app/components/app/modals/confirm-reset-account/confirm-reset-account.component.js diff --git a/ui/app/components/modals/confirm-reset-account/confirm-reset-account.container.js b/ui/app/components/app/modals/confirm-reset-account/confirm-reset-account.container.js similarity index 70% rename from ui/app/components/modals/confirm-reset-account/confirm-reset-account.container.js rename to ui/app/components/app/modals/confirm-reset-account/confirm-reset-account.container.js index c8a7b84780ed..ffbd40d9d0bc 100644 --- a/ui/app/components/modals/confirm-reset-account/confirm-reset-account.container.js +++ b/ui/app/components/app/modals/confirm-reset-account/confirm-reset-account.container.js @@ -1,8 +1,8 @@ import { connect } from 'react-redux' import { compose } from 'recompose' -import withModalProps from '../../../higher-order-components/with-modal-props' +import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' import ConfirmResetAccount from './confirm-reset-account.component' -import { resetAccount } from '../../../actions' +import { resetAccount } from '../../../../store/actions' const mapDispatchToProps = dispatch => { return { diff --git a/ui/app/components/modals/confirm-reset-account/index.js b/ui/app/components/app/modals/confirm-reset-account/index.js similarity index 100% rename from ui/app/components/modals/confirm-reset-account/index.js rename to ui/app/components/app/modals/confirm-reset-account/index.js diff --git a/ui/app/components/modals/customize-gas/customize-gas.component.js b/ui/app/components/app/modals/customize-gas/customize-gas.component.js similarity index 99% rename from ui/app/components/modals/customize-gas/customize-gas.component.js rename to ui/app/components/app/modals/customize-gas/customize-gas.component.js index 4e2e206607c1..5db5c79e73d0 100644 --- a/ui/app/components/modals/customize-gas/customize-gas.component.js +++ b/ui/app/components/app/modals/customize-gas/customize-gas.component.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types' import BigNumber from 'bignumber.js' import GasModalCard from '../../customize-gas-modal/gas-modal-card' import { MIN_GAS_PRICE_GWEI } from '../../send/send.constants' -import Button from '../../button' +import Button from '../../../ui/button' import { getDecimalGasLimit, diff --git a/ui/app/components/modals/customize-gas/customize-gas.container.js b/ui/app/components/app/modals/customize-gas/customize-gas.container.js similarity index 89% rename from ui/app/components/modals/customize-gas/customize-gas.container.js rename to ui/app/components/app/modals/customize-gas/customize-gas.container.js index 46a799795496..221881a8ae89 100644 --- a/ui/app/components/modals/customize-gas/customize-gas.container.js +++ b/ui/app/components/app/modals/customize-gas/customize-gas.container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import CustomizeGas from './customize-gas.component' -import { hideModal } from '../../../actions' +import { hideModal } from '../../../../store/actions' const mapStateToProps = state => { const { appState: { modal: { modalState: { props } } } } = state diff --git a/ui/app/components/modals/customize-gas/customize-gas.util.js b/ui/app/components/app/modals/customize-gas/customize-gas.util.js similarity index 91% rename from ui/app/components/modals/customize-gas/customize-gas.util.js rename to ui/app/components/app/modals/customize-gas/customize-gas.util.js index 6ba4a7705a47..e686183bddd6 100644 --- a/ui/app/components/modals/customize-gas/customize-gas.util.js +++ b/ui/app/components/app/modals/customize-gas/customize-gas.util.js @@ -1,5 +1,5 @@ import ethUtil from 'ethereumjs-util' -import { conversionUtil } from '../../../conversion-util' +import { conversionUtil } from '../../../../helpers/utils/conversion-util' export function getDecimalGasLimit (hexGasLimit) { return conversionUtil(hexGasLimit, { diff --git a/ui/app/components/modals/customize-gas/index.js b/ui/app/components/app/modals/customize-gas/index.js similarity index 100% rename from ui/app/components/modals/customize-gas/index.js rename to ui/app/components/app/modals/customize-gas/index.js diff --git a/ui/app/components/modals/customize-gas/index.scss b/ui/app/components/app/modals/customize-gas/index.scss similarity index 100% rename from ui/app/components/modals/customize-gas/index.scss rename to ui/app/components/app/modals/customize-gas/index.scss diff --git a/ui/app/components/modals/deposit-ether-modal.js b/ui/app/components/app/modals/deposit-ether-modal.js similarity index 91% rename from ui/app/components/modals/deposit-ether-modal.js rename to ui/app/components/app/modals/deposit-ether-modal.js index 09137d39a194..082ff76a9167 100644 --- a/ui/app/components/modals/deposit-ether-modal.js +++ b/ui/app/components/app/modals/deposit-ether-modal.js @@ -3,16 +3,16 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect -const actions = require('../../actions') -const { getNetworkDisplayName } = require('../../../../app/scripts/controllers/network/util') +const actions = require('../../../store/actions') +const { getNetworkDisplayName } = require('../../../../../app/scripts/controllers/network/util') const ShapeshiftForm = require('../shapeshift-form') -import Button from '../button' +import Button from '../../ui/button' let DIRECT_DEPOSIT_ROW_TITLE let DIRECT_DEPOSIT_ROW_TEXT -let COINBASE_ROW_TITLE -let COINBASE_ROW_TEXT +let WYRE_ROW_TITLE +let WYRE_ROW_TEXT let SHAPESHIFT_ROW_TITLE let SHAPESHIFT_ROW_TEXT let FAUCET_ROW_TITLE @@ -49,8 +49,8 @@ function DepositEtherModal (props, context) { // need to set after i18n locale has loaded DIRECT_DEPOSIT_ROW_TITLE = context.t('directDepositEther') DIRECT_DEPOSIT_ROW_TEXT = context.t('directDepositEtherExplainer') - COINBASE_ROW_TITLE = context.t('buyCoinbase') - COINBASE_ROW_TEXT = context.t('buyCoinbaseExplainer') + WYRE_ROW_TITLE = context.t('buyWithWyre') + WYRE_ROW_TEXT = context.t('buyWithWyreDescription') SHAPESHIFT_ROW_TITLE = context.t('depositShapeShift') SHAPESHIFT_ROW_TEXT = context.t('depositShapeShiftExplainer') FAUCET_ROW_TITLE = context.t('testFaucet') @@ -176,13 +176,13 @@ DepositEtherModal.prototype.render = function () { this.renderRow({ logo: h('div.deposit-ether-modal__logo', { style: { - backgroundImage: 'url(\'./images/coinbase logo.png\')', + backgroundImage: 'url(\'./images/wyre.svg\')', height: '40px', }, }), - title: COINBASE_ROW_TITLE, - text: COINBASE_ROW_TEXT, - buttonLabel: this.context.t('continueToCoinbase'), + title: WYRE_ROW_TITLE, + text: WYRE_ROW_TEXT, + buttonLabel: this.context.t('continueToWyre'), onButtonClick: () => toCoinbase(address), hide: isTestNetwork || buyingWithShapeshift, }), diff --git a/ui/app/components/modals/edit-account-name-modal.js b/ui/app/components/app/modals/edit-account-name-modal.js similarity index 94% rename from ui/app/components/modals/edit-account-name-modal.js rename to ui/app/components/app/modals/edit-account-name-modal.js index edced8725790..41a9862e9c81 100644 --- a/ui/app/components/modals/edit-account-name-modal.js +++ b/ui/app/components/app/modals/edit-account-name-modal.js @@ -3,8 +3,8 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect -const actions = require('../../actions') -const { getSelectedAccount } = require('../../selectors') +const actions = require('../../../store/actions') +const { getSelectedAccount } = require('../../../selectors/selectors') function mapStateToProps (state) { return { diff --git a/ui/app/components/modals/export-private-key-modal.js b/ui/app/components/app/modals/export-private-key-modal.js similarity index 94% rename from ui/app/components/modals/export-private-key-modal.js rename to ui/app/components/app/modals/export-private-key-modal.js index d3e3c9a569af..639887d4c815 100644 --- a/ui/app/components/modals/export-private-key-modal.js +++ b/ui/app/components/app/modals/export-private-key-modal.js @@ -5,13 +5,13 @@ const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect const { stripHexPrefix } = require('ethereumjs-util') -const actions = require('../../actions') +const actions = require('../../../store/actions') const AccountModalContainer = require('./account-modal-container') -const { getSelectedIdentity } = require('../../selectors') -const ReadOnlyInput = require('../readonly-input') +const { getSelectedIdentity } = require('../../../selectors/selectors') +const ReadOnlyInput = require('../../ui/readonly-input') const copyToClipboard = require('copy-to-clipboard') -const { checksumAddress } = require('../../util') -import Button from '../button' +const { checksumAddress } = require('../../../helpers/utils/util') +import Button from '../../ui/button' function mapStateToPropsFactory () { let selectedIdentity = null diff --git a/ui/app/components/modals/hide-token-confirmation-modal.js b/ui/app/components/app/modals/hide-token-confirmation-modal.js similarity index 95% rename from ui/app/components/modals/hide-token-confirmation-modal.js rename to ui/app/components/app/modals/hide-token-confirmation-modal.js index 43f3009a5962..8a9a48fd2278 100644 --- a/ui/app/components/modals/hide-token-confirmation-modal.js +++ b/ui/app/components/app/modals/hide-token-confirmation-modal.js @@ -3,8 +3,8 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect -const actions = require('../../actions') -import Identicon from '../identicon' +const actions = require('../../../store/actions') +import Identicon from '../../ui/identicon' function mapStateToProps (state) { return { diff --git a/ui/app/components/modals/index.js b/ui/app/components/app/modals/index.js similarity index 100% rename from ui/app/components/modals/index.js rename to ui/app/components/app/modals/index.js diff --git a/ui/app/components/app/modals/index.scss b/ui/app/components/app/modals/index.scss new file mode 100644 index 000000000000..09b0bb73c527 --- /dev/null +++ b/ui/app/components/app/modals/index.scss @@ -0,0 +1,11 @@ +@import 'cancel-transaction/index'; + +@import 'confirm-remove-account/index'; + +@import 'customize-gas/index'; + +@import 'qr-scanner/index'; + +@import 'transaction-confirmed/index'; + +@import 'metametrics-opt-in-modal/index'; diff --git a/ui/app/components/modals/loading-network-error/index.js b/ui/app/components/app/modals/loading-network-error/index.js similarity index 100% rename from ui/app/components/modals/loading-network-error/index.js rename to ui/app/components/app/modals/loading-network-error/index.js diff --git a/ui/app/components/modals/loading-network-error/loading-network-error.component.js b/ui/app/components/app/modals/loading-network-error/loading-network-error.component.js similarity index 100% rename from ui/app/components/modals/loading-network-error/loading-network-error.component.js rename to ui/app/components/app/modals/loading-network-error/loading-network-error.component.js diff --git a/ui/app/components/modals/loading-network-error/loading-network-error.container.js b/ui/app/components/app/modals/loading-network-error/loading-network-error.container.js similarity index 57% rename from ui/app/components/modals/loading-network-error/loading-network-error.container.js rename to ui/app/components/app/modals/loading-network-error/loading-network-error.container.js index 3fcba20aa9f9..38ea9b2ab2a2 100644 --- a/ui/app/components/modals/loading-network-error/loading-network-error.container.js +++ b/ui/app/components/app/modals/loading-network-error/loading-network-error.container.js @@ -1,4 +1,4 @@ import LoadingNetworkError from './loading-network-error.component' -import withModalProps from '../../../higher-order-components/with-modal-props' +import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' export default withModalProps(LoadingNetworkError) diff --git a/ui/app/components/modals/metametrics-opt-in-modal/index.js b/ui/app/components/app/modals/metametrics-opt-in-modal/index.js similarity index 100% rename from ui/app/components/modals/metametrics-opt-in-modal/index.js rename to ui/app/components/app/modals/metametrics-opt-in-modal/index.js diff --git a/ui/app/components/modals/metametrics-opt-in-modal/index.scss b/ui/app/components/app/modals/metametrics-opt-in-modal/index.scss similarity index 100% rename from ui/app/components/modals/metametrics-opt-in-modal/index.scss rename to ui/app/components/app/modals/metametrics-opt-in-modal/index.scss diff --git a/ui/app/components/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.component.js b/ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.component.js similarity index 93% rename from ui/app/components/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.component.js rename to ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.component.js index 36f1ed92daaf..0335991fc0e9 100644 --- a/ui/app/components/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.component.js +++ b/ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.component.js @@ -1,6 +1,6 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import PageContainerFooter from '../../page-container/page-container-footer' +import PageContainerFooter from '../../../ui/page-container/page-container-footer' export default class MetaMetricsOptInModal extends Component { static propTypes = { @@ -40,7 +40,7 @@ export default class MetaMetricsOptInModal extends Component {
MetaMask would like to gather usage data to better understand how our users interact with the extension. This data - will be used to continually improve the usability and user experience of our product and the etheruem ecosystem. + will be used to continually improve the usability and user experience of our product and the Ethereum ecosystem.
MetaMask will.. @@ -86,7 +86,13 @@ export default class MetaMetricsOptInModal extends Component {
- This data is aggregated and is therefore anonymous for the purposes of General Data Protection Regulation (EU) 2016/679. For more information in relation to our privacy practices, please see our Privacy Policy here. + This data is aggregated and is therefore anonymous for the purposes of General Data Protection Regulation (EU) 2016/679. For more information in relation to our privacy practices, please see our + Privacy Policy here + .
diff --git a/ui/app/components/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.container.js b/ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.container.js similarity index 76% rename from ui/app/components/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.container.js rename to ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.container.js index 525806b75a24..83595281f1f4 100644 --- a/ui/app/components/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.container.js +++ b/ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.container.js @@ -1,8 +1,8 @@ import { connect } from 'react-redux' import { compose } from 'recompose' import MetaMetricsOptInModal from './metametrics-opt-in-modal.component' -import withModalProps from '../../../higher-order-components/with-modal-props' -import { setParticipateInMetaMetrics } from '../../../actions' +import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' +import { setParticipateInMetaMetrics } from '../../../../store/actions' const mapStateToProps = (state, ownProps) => { const { unapprovedTxCount } = ownProps diff --git a/ui/app/components/modals/modal.js b/ui/app/components/app/modals/modal.js similarity index 96% rename from ui/app/components/modals/modal.js rename to ui/app/components/app/modals/modal.js index 8ab599a716dc..717f623af394 100644 --- a/ui/app/components/modals/modal.js +++ b/ui/app/components/app/modals/modal.js @@ -3,11 +3,11 @@ const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect const FadeModal = require('boron').FadeModal -const actions = require('../../actions') -const { resetCustomData: resetCustomGasData } = require('../../ducks/gas.duck') -const isMobileView = require('../../../lib/is-mobile-view') -const { getEnvironmentType } = require('../../../../app/scripts/lib/util') -const { ENVIRONMENT_TYPE_POPUP } = require('../../../../app/scripts/lib/enums') +const actions = require('../../../store/actions') +const { resetCustomData: resetCustomGasData } = require('../../../ducks/gas/gas.duck') +const isMobileView = require('../../../../lib/is-mobile-view') +const { getEnvironmentType } = require('../../../../../app/scripts/lib/util') +const { ENVIRONMENT_TYPE_POPUP } = require('../../../../../app/scripts/lib/enums') // Modal Components const BuyOptions = require('./buy-options-modal') diff --git a/ui/app/components/modals/new-account-modal.js b/ui/app/components/app/modals/new-account-modal.js similarity index 98% rename from ui/app/components/modals/new-account-modal.js rename to ui/app/components/app/modals/new-account-modal.js index a66a3ed4a184..27c81a7013ab 100644 --- a/ui/app/components/modals/new-account-modal.js +++ b/ui/app/components/app/modals/new-account-modal.js @@ -2,7 +2,7 @@ const { Component } = require('react') const PropTypes = require('prop-types') const h = require('react-hyperscript') const connect = require('react-redux').connect -const actions = require('../../actions') +const actions = require('../../../store/actions') class NewAccountModal extends Component { constructor (props) { diff --git a/ui/app/components/modals/notification-modal.js b/ui/app/components/app/modals/notification-modal.js similarity index 97% rename from ui/app/components/modals/notification-modal.js rename to ui/app/components/app/modals/notification-modal.js index 46a4c8a2174e..2d73b2cfa794 100644 --- a/ui/app/components/modals/notification-modal.js +++ b/ui/app/components/app/modals/notification-modal.js @@ -2,7 +2,7 @@ const { Component } = require('react') const PropTypes = require('prop-types') const h = require('react-hyperscript') const connect = require('react-redux').connect -const actions = require('../../actions') +const actions = require('../../../store/actions') class NotificationModal extends Component { render () { diff --git a/ui/app/components/modals/qr-scanner/index.js b/ui/app/components/app/modals/qr-scanner/index.js similarity index 100% rename from ui/app/components/modals/qr-scanner/index.js rename to ui/app/components/app/modals/qr-scanner/index.js diff --git a/ui/app/components/modals/qr-scanner/index.scss b/ui/app/components/app/modals/qr-scanner/index.scss similarity index 100% rename from ui/app/components/modals/qr-scanner/index.scss rename to ui/app/components/app/modals/qr-scanner/index.scss diff --git a/ui/app/components/modals/qr-scanner/qr-scanner.component.js b/ui/app/components/app/modals/qr-scanner/qr-scanner.component.js similarity index 96% rename from ui/app/components/modals/qr-scanner/qr-scanner.component.js rename to ui/app/components/app/modals/qr-scanner/qr-scanner.component.js index cb8d07d83831..20915b5f9c4d 100644 --- a/ui/app/components/modals/qr-scanner/qr-scanner.component.js +++ b/ui/app/components/app/modals/qr-scanner/qr-scanner.component.js @@ -2,9 +2,9 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import { BrowserQRCodeReader } from '@zxing/library' import adapter from 'webrtc-adapter' // eslint-disable-line import/no-nodejs-modules, no-unused-vars -import Spinner from '../../spinner' -import WebcamUtils from '../../../../lib/webcam-utils' -import PageContainerFooter from '../../page-container/page-container-footer/page-container-footer.component' +import Spinner from '../../../ui/spinner' +import WebcamUtils from '../../../../../lib/webcam-utils' +import PageContainerFooter from '../../../ui/page-container/page-container-footer/page-container-footer.component' export default class QrScanner extends Component { static propTypes = { diff --git a/ui/app/components/modals/qr-scanner/qr-scanner.container.js b/ui/app/components/app/modals/qr-scanner/qr-scanner.container.js similarity index 89% rename from ui/app/components/modals/qr-scanner/qr-scanner.container.js rename to ui/app/components/app/modals/qr-scanner/qr-scanner.container.js index d0a35e03b70e..2210fbed2fe6 100644 --- a/ui/app/components/modals/qr-scanner/qr-scanner.container.js +++ b/ui/app/components/app/modals/qr-scanner/qr-scanner.container.js @@ -1,10 +1,10 @@ import { connect } from 'react-redux' import QrScanner from './qr-scanner.component' -const { hideModal, qrCodeDetected, showQrScanner } = require('../../../actions') +const { hideModal, qrCodeDetected, showQrScanner } = require('../../../../store/actions') import { SEND_ROUTE, -} from '../../../routes' +} from '../../../../helpers/constants/routes' const mapStateToProps = state => { return { diff --git a/ui/app/components/modals/reject-transactions/index.js b/ui/app/components/app/modals/reject-transactions/index.js similarity index 100% rename from ui/app/components/modals/reject-transactions/index.js rename to ui/app/components/app/modals/reject-transactions/index.js diff --git a/ui/app/components/modals/reject-transactions/index.scss b/ui/app/components/app/modals/reject-transactions/index.scss similarity index 100% rename from ui/app/components/modals/reject-transactions/index.scss rename to ui/app/components/app/modals/reject-transactions/index.scss diff --git a/ui/app/components/modals/reject-transactions/reject-transactions.component.js b/ui/app/components/app/modals/reject-transactions/reject-transactions.component.js similarity index 100% rename from ui/app/components/modals/reject-transactions/reject-transactions.component.js rename to ui/app/components/app/modals/reject-transactions/reject-transactions.component.js diff --git a/ui/app/components/modals/reject-transactions/reject-transactions.container.js b/ui/app/components/app/modals/reject-transactions/reject-transactions.container.js similarity index 80% rename from ui/app/components/modals/reject-transactions/reject-transactions.container.js rename to ui/app/components/app/modals/reject-transactions/reject-transactions.container.js index 81e98d3ff90d..d2af05573fd8 100644 --- a/ui/app/components/modals/reject-transactions/reject-transactions.container.js +++ b/ui/app/components/app/modals/reject-transactions/reject-transactions.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import { compose } from 'recompose' import RejectTransactionsModal from './reject-transactions.component' -import withModalProps from '../../../higher-order-components/with-modal-props' +import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' const mapStateToProps = (state, ownProps) => { const { unapprovedTxCount } = ownProps diff --git a/ui/app/components/modals/shapeshift-deposit-tx-modal.js b/ui/app/components/app/modals/shapeshift-deposit-tx-modal.js similarity index 90% rename from ui/app/components/modals/shapeshift-deposit-tx-modal.js rename to ui/app/components/app/modals/shapeshift-deposit-tx-modal.js index 242c7b89d3ea..ada9430f7b97 100644 --- a/ui/app/components/modals/shapeshift-deposit-tx-modal.js +++ b/ui/app/components/app/modals/shapeshift-deposit-tx-modal.js @@ -2,8 +2,8 @@ const Component = require('react').Component const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect -const actions = require('../../actions') -const QrView = require('../qr-code') +const actions = require('../../../store/actions') +const QrView = require('../../ui/qr-code') const AccountModalContainer = require('./account-modal-container') function mapStateToProps (state) { diff --git a/ui/app/components/modals/transaction-confirmed/index.js b/ui/app/components/app/modals/transaction-confirmed/index.js similarity index 100% rename from ui/app/components/modals/transaction-confirmed/index.js rename to ui/app/components/app/modals/transaction-confirmed/index.js diff --git a/ui/app/components/modals/transaction-confirmed/index.scss b/ui/app/components/app/modals/transaction-confirmed/index.scss similarity index 100% rename from ui/app/components/modals/transaction-confirmed/index.scss rename to ui/app/components/app/modals/transaction-confirmed/index.scss diff --git a/ui/app/components/modals/transaction-confirmed/transaction-confirmed.component.js b/ui/app/components/app/modals/transaction-confirmed/transaction-confirmed.component.js similarity index 100% rename from ui/app/components/modals/transaction-confirmed/transaction-confirmed.component.js rename to ui/app/components/app/modals/transaction-confirmed/transaction-confirmed.component.js diff --git a/ui/app/components/modals/transaction-confirmed/transaction-confirmed.container.js b/ui/app/components/app/modals/transaction-confirmed/transaction-confirmed.container.js similarity index 57% rename from ui/app/components/modals/transaction-confirmed/transaction-confirmed.container.js rename to ui/app/components/app/modals/transaction-confirmed/transaction-confirmed.container.js index d4e39681aee3..9089ec158441 100644 --- a/ui/app/components/modals/transaction-confirmed/transaction-confirmed.container.js +++ b/ui/app/components/app/modals/transaction-confirmed/transaction-confirmed.container.js @@ -1,4 +1,4 @@ import TransactionConfirmed from './transaction-confirmed.component' -import withModalProps from '../../../higher-order-components/with-modal-props' +import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' export default withModalProps(TransactionConfirmed) diff --git a/ui/app/components/network-display/index.js b/ui/app/components/app/network-display/index.js similarity index 100% rename from ui/app/components/network-display/index.js rename to ui/app/components/app/network-display/index.js diff --git a/ui/app/components/network-display/index.scss b/ui/app/components/app/network-display/index.scss similarity index 100% rename from ui/app/components/network-display/index.scss rename to ui/app/components/app/network-display/index.scss diff --git a/ui/app/components/network-display/network-display.component.js b/ui/app/components/app/network-display/network-display.component.js similarity index 96% rename from ui/app/components/network-display/network-display.component.js rename to ui/app/components/app/network-display/network-display.component.js index 22d617099408..1142e8606202 100644 --- a/ui/app/components/network-display/network-display.component.js +++ b/ui/app/components/app/network-display/network-display.component.js @@ -6,7 +6,7 @@ import { ROPSTEN_CODE, RINKEYBY_CODE, KOVAN_CODE, -} from '../../../../app/scripts/controllers/network/enums' +} from '../../../../../app/scripts/controllers/network/enums' const networkToClassHash = { [MAINNET_CODE]: 'mainnet', diff --git a/ui/app/components/network-display/network-display.container.js b/ui/app/components/app/network-display/network-display.container.js similarity index 100% rename from ui/app/components/network-display/network-display.container.js rename to ui/app/components/app/network-display/network-display.container.js diff --git a/ui/app/components/network.js b/ui/app/components/app/network.js similarity index 100% rename from ui/app/components/network.js rename to ui/app/components/app/network.js diff --git a/ui/app/components/notice.js b/ui/app/components/app/notice.js similarity index 100% rename from ui/app/components/notice.js rename to ui/app/components/app/notice.js diff --git a/ui/app/components/provider-page-container/index.js b/ui/app/components/app/provider-page-container/index.js similarity index 100% rename from ui/app/components/provider-page-container/index.js rename to ui/app/components/app/provider-page-container/index.js diff --git a/ui/app/components/provider-page-container/index.scss b/ui/app/components/app/provider-page-container/index.scss similarity index 100% rename from ui/app/components/provider-page-container/index.scss rename to ui/app/components/app/provider-page-container/index.scss diff --git a/ui/app/components/provider-page-container/provider-page-container-content/index.js b/ui/app/components/app/provider-page-container/provider-page-container-content/index.js similarity index 100% rename from ui/app/components/provider-page-container/provider-page-container-content/index.js rename to ui/app/components/app/provider-page-container/provider-page-container-content/index.js diff --git a/ui/app/components/provider-page-container/provider-page-container-content/provider-page-container-content.component.js b/ui/app/components/app/provider-page-container/provider-page-container-content/provider-page-container-content.component.js similarity index 97% rename from ui/app/components/provider-page-container/provider-page-container-content/provider-page-container-content.component.js rename to ui/app/components/app/provider-page-container/provider-page-container-content/provider-page-container-content.component.js index 268db613fab4..0eb1d616a67e 100644 --- a/ui/app/components/provider-page-container/provider-page-container-content/provider-page-container-content.component.js +++ b/ui/app/components/app/provider-page-container/provider-page-container-content/provider-page-container-content.component.js @@ -1,6 +1,6 @@ import PropTypes from 'prop-types' import React, {PureComponent} from 'react' -import Identicon from '../../identicon' +import Identicon from '../../../ui/identicon' export default class ProviderPageContainerContent extends PureComponent { static propTypes = { diff --git a/ui/app/components/provider-page-container/provider-page-container-content/provider-page-container-content.container.js b/ui/app/components/app/provider-page-container/provider-page-container-content/provider-page-container-content.container.js similarity index 81% rename from ui/app/components/provider-page-container/provider-page-container-content/provider-page-container-content.container.js rename to ui/app/components/app/provider-page-container/provider-page-container-content/provider-page-container-content.container.js index 3ea1ce20e921..4dbdddd161b0 100644 --- a/ui/app/components/provider-page-container/provider-page-container-content/provider-page-container-content.container.js +++ b/ui/app/components/app/provider-page-container/provider-page-container-content/provider-page-container-content.container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import ProviderPageContainerContent from './provider-page-container-content.component' -import { getSelectedIdentity } from '../../../selectors' +import { getSelectedIdentity } from '../../../../selectors/selectors' const mapStateToProps = (state) => { return { diff --git a/ui/app/components/provider-page-container/provider-page-container-header/index.js b/ui/app/components/app/provider-page-container/provider-page-container-header/index.js similarity index 100% rename from ui/app/components/provider-page-container/provider-page-container-header/index.js rename to ui/app/components/app/provider-page-container/provider-page-container-header/index.js diff --git a/ui/app/components/provider-page-container/provider-page-container-header/provider-page-container-header.component.js b/ui/app/components/app/provider-page-container/provider-page-container-header/provider-page-container-header.component.js similarity index 100% rename from ui/app/components/provider-page-container/provider-page-container-header/provider-page-container-header.component.js rename to ui/app/components/app/provider-page-container/provider-page-container-header/provider-page-container-header.component.js diff --git a/ui/app/components/provider-page-container/provider-page-container.component.js b/ui/app/components/app/provider-page-container/provider-page-container.component.js similarity index 96% rename from ui/app/components/provider-page-container/provider-page-container.component.js rename to ui/app/components/app/provider-page-container/provider-page-container.component.js index ff063166de94..910def2a313e 100644 --- a/ui/app/components/provider-page-container/provider-page-container.component.js +++ b/ui/app/components/app/provider-page-container/provider-page-container.component.js @@ -1,7 +1,7 @@ import PropTypes from 'prop-types' import React, {PureComponent} from 'react' -import { ProviderPageContainerContent, ProviderPageContainerHeader } from './' -import { PageContainerFooter } from '../page-container' +import { ProviderPageContainerContent, ProviderPageContainerHeader } from '.' +import { PageContainerFooter } from '../../ui/page-container' export default class ProviderPageContainer extends PureComponent { static propTypes = { diff --git a/ui/app/components/selected-account/index.js b/ui/app/components/app/selected-account/index.js similarity index 100% rename from ui/app/components/selected-account/index.js rename to ui/app/components/app/selected-account/index.js diff --git a/ui/app/components/selected-account/index.scss b/ui/app/components/app/selected-account/index.scss similarity index 100% rename from ui/app/components/selected-account/index.scss rename to ui/app/components/app/selected-account/index.scss diff --git a/ui/app/components/selected-account/selected-account.component.js b/ui/app/components/app/selected-account/selected-account.component.js similarity index 91% rename from ui/app/components/selected-account/selected-account.component.js rename to ui/app/components/app/selected-account/selected-account.component.js index 47c56e312678..5a3fa815f036 100644 --- a/ui/app/components/selected-account/selected-account.component.js +++ b/ui/app/components/app/selected-account/selected-account.component.js @@ -1,9 +1,9 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import copyToClipboard from 'copy-to-clipboard' -import { addressSlicer, checksumAddress } from '../../util' +import { addressSlicer, checksumAddress } from '../../../helpers/utils/util' -const Tooltip = require('../tooltip-v2.js').default +const Tooltip = require('../../ui/tooltip-v2.js').default class SelectedAccount extends Component { state = { diff --git a/ui/app/components/selected-account/selected-account.container.js b/ui/app/components/app/selected-account/selected-account.container.js similarity index 86% rename from ui/app/components/selected-account/selected-account.container.js rename to ui/app/components/app/selected-account/selected-account.container.js index 1c8d17d8d8ac..b5dbe74f36a0 100644 --- a/ui/app/components/selected-account/selected-account.container.js +++ b/ui/app/components/app/selected-account/selected-account.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import SelectedAccount from './selected-account.component' -const selectors = require('../../selectors') +const selectors = require('../../../selectors/selectors') const mapStateToProps = state => { return { diff --git a/ui/app/components/selected-account/tests/selected-account-component.test.js b/ui/app/components/app/selected-account/tests/selected-account-component.test.js similarity index 100% rename from ui/app/components/selected-account/tests/selected-account-component.test.js rename to ui/app/components/app/selected-account/tests/selected-account-component.test.js diff --git a/ui/app/components/send/README.md b/ui/app/components/app/send/README.md similarity index 100% rename from ui/app/components/send/README.md rename to ui/app/components/app/send/README.md diff --git a/ui/app/components/send/account-list-item/account-list-item-README.md b/ui/app/components/app/send/account-list-item/account-list-item-README.md similarity index 100% rename from ui/app/components/send/account-list-item/account-list-item-README.md rename to ui/app/components/app/send/account-list-item/account-list-item-README.md diff --git a/ui/app/components/send/account-list-item/account-list-item.component.js b/ui/app/components/app/send/account-list-item/account-list-item.component.js similarity index 92% rename from ui/app/components/send/account-list-item/account-list-item.component.js rename to ui/app/components/app/send/account-list-item/account-list-item.component.js index 0420af46b28b..18e77b4f9919 100644 --- a/ui/app/components/send/account-list-item/account-list-item.component.js +++ b/ui/app/components/app/send/account-list-item/account-list-item.component.js @@ -1,11 +1,11 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import { checksumAddress } from '../../../util' -import Identicon from '../../identicon' +import { checksumAddress } from '../../../../helpers/utils/util' +import Identicon from '../../../ui/identicon' import UserPreferencedCurrencyDisplay from '../../user-preferenced-currency-display' -import { PRIMARY, SECONDARY } from '../../../constants/common' -import Tooltip from '../../tooltip-v2' +import { PRIMARY, SECONDARY } from '../../../../helpers/constants/common' +import Tooltip from '../../../ui/tooltip-v2' export default class AccountListItem extends Component { diff --git a/ui/app/components/send/account-list-item/account-list-item.container.js b/ui/app/components/app/send/account-list-item/account-list-item.container.js similarity index 94% rename from ui/app/components/send/account-list-item/account-list-item.container.js rename to ui/app/components/app/send/account-list-item/account-list-item.container.js index c045ef14f70d..bc9a60f49b24 100644 --- a/ui/app/components/send/account-list-item/account-list-item.container.js +++ b/ui/app/components/app/send/account-list-item/account-list-item.container.js @@ -8,7 +8,7 @@ import { getIsMainnet, isBalanceCached, preferencesSelector, -} from '../../../selectors' +} from '../../../../selectors/selectors' import AccountListItem from './account-list-item.component' export default connect(mapStateToProps)(AccountListItem) diff --git a/ui/app/components/send/account-list-item/index.js b/ui/app/components/app/send/account-list-item/index.js similarity index 100% rename from ui/app/components/send/account-list-item/index.js rename to ui/app/components/app/send/account-list-item/index.js diff --git a/ui/app/components/send/account-list-item/tests/account-list-item-component.test.js b/ui/app/components/app/send/account-list-item/tests/account-list-item-component.test.js similarity index 98% rename from ui/app/components/send/account-list-item/tests/account-list-item-component.test.js rename to ui/app/components/app/send/account-list-item/tests/account-list-item-component.test.js index 2bd2ce0c55a9..5df9f77d6816 100644 --- a/ui/app/components/send/account-list-item/tests/account-list-item-component.test.js +++ b/ui/app/components/app/send/account-list-item/tests/account-list-item-component.test.js @@ -3,7 +3,7 @@ import assert from 'assert' import { shallow } from 'enzyme' import sinon from 'sinon' import proxyquire from 'proxyquire' -import Identicon from '../../../identicon' +import Identicon from '../../../../ui/identicon' import UserPreferencedCurrencyDisplay from '../../../user-preferenced-currency-display' const utilsMethodStubs = { @@ -11,7 +11,7 @@ const utilsMethodStubs = { } const AccountListItem = proxyquire('../account-list-item.component.js', { - '../../../util': utilsMethodStubs, + '../../../../helpers/utils/util': utilsMethodStubs, }).default diff --git a/ui/app/components/send/account-list-item/tests/account-list-item-container.test.js b/ui/app/components/app/send/account-list-item/tests/account-list-item-container.test.js similarity index 98% rename from ui/app/components/send/account-list-item/tests/account-list-item-container.test.js rename to ui/app/components/app/send/account-list-item/tests/account-list-item-container.test.js index 662880aa0409..19a9a02d0461 100644 --- a/ui/app/components/send/account-list-item/tests/account-list-item-container.test.js +++ b/ui/app/components/app/send/account-list-item/tests/account-list-item-container.test.js @@ -15,7 +15,7 @@ proxyquire('../account-list-item.container.js', { getCurrentCurrency: () => `mockCurrentCurrency`, getNativeCurrency: () => `mockNativeCurrency`, }, - '../../../selectors.js': { + '../../../../selectors/selectors': { isBalanceCached: () => `mockBalanceIsCached`, preferencesSelector: ({ showFiatInTestnets }) => ({ showFiatInTestnets, diff --git a/ui/app/components/send/index.js b/ui/app/components/app/send/index.js similarity index 100% rename from ui/app/components/send/index.js rename to ui/app/components/app/send/index.js diff --git a/ui/app/components/send/send-content/index.js b/ui/app/components/app/send/send-content/index.js similarity index 100% rename from ui/app/components/send/send-content/index.js rename to ui/app/components/app/send/send-content/index.js diff --git a/ui/app/components/send/send-content/send-amount-row/README.md b/ui/app/components/app/send/send-content/send-amount-row/README.md similarity index 100% rename from ui/app/components/send/send-content/send-amount-row/README.md rename to ui/app/components/app/send/send-content/send-amount-row/README.md diff --git a/ui/app/components/send/send-content/send-amount-row/amount-max-button/amount-max-button.component.js b/ui/app/components/app/send/send-content/send-amount-row/amount-max-button/amount-max-button.component.js similarity index 100% rename from ui/app/components/send/send-content/send-amount-row/amount-max-button/amount-max-button.component.js rename to ui/app/components/app/send/send-content/send-amount-row/amount-max-button/amount-max-button.component.js diff --git a/ui/app/components/send/send-content/send-amount-row/amount-max-button/amount-max-button.container.js b/ui/app/components/app/send/send-content/send-amount-row/amount-max-button/amount-max-button.container.js similarity index 92% rename from ui/app/components/send/send-content/send-amount-row/amount-max-button/amount-max-button.container.js rename to ui/app/components/app/send/send-content/send-amount-row/amount-max-button/amount-max-button.container.js index 2d2ec42f7909..16c5a0db5985 100644 --- a/ui/app/components/send/send-content/send-amount-row/amount-max-button/amount-max-button.container.js +++ b/ui/app/components/app/send/send-content/send-amount-row/amount-max-button/amount-max-button.container.js @@ -10,11 +10,11 @@ import { calcMaxAmount } from './amount-max-button.utils.js' import { updateSendAmount, setMaxModeTo, -} from '../../../../../actions' +} from '../../../../../../store/actions' import AmountMaxButton from './amount-max-button.component' import { updateSendErrors, -} from '../../../../../ducks/send.duck' +} from '../../../../../../ducks/send/send.duck' export default connect(mapStateToProps, mapDispatchToProps)(AmountMaxButton) diff --git a/ui/app/components/send/send-content/send-amount-row/amount-max-button/amount-max-button.selectors.js b/ui/app/components/app/send/send-content/send-amount-row/amount-max-button/amount-max-button.selectors.js similarity index 100% rename from ui/app/components/send/send-content/send-amount-row/amount-max-button/amount-max-button.selectors.js rename to ui/app/components/app/send/send-content/send-amount-row/amount-max-button/amount-max-button.selectors.js diff --git a/ui/app/components/send/send-content/send-amount-row/amount-max-button/amount-max-button.utils.js b/ui/app/components/app/send/send-content/send-amount-row/amount-max-button/amount-max-button.utils.js similarity index 90% rename from ui/app/components/send/send-content/send-amount-row/amount-max-button/amount-max-button.utils.js rename to ui/app/components/app/send/send-content/send-amount-row/amount-max-button/amount-max-button.utils.js index 27181d2f5a6d..f4c8fad8adb4 100644 --- a/ui/app/components/send/send-content/send-amount-row/amount-max-button/amount-max-button.utils.js +++ b/ui/app/components/app/send/send-content/send-amount-row/amount-max-button/amount-max-button.utils.js @@ -1,7 +1,7 @@ const { multiplyCurrencies, subtractCurrencies, -} = require('../../../../../conversion-util') +} = require('../../../../../../helpers/utils/conversion-util') const ethUtil = require('ethereumjs-util') function calcMaxAmount ({ balance, gasTotal, selectedToken, tokenBalance }) { diff --git a/ui/app/components/send/send-content/send-amount-row/amount-max-button/index.js b/ui/app/components/app/send/send-content/send-amount-row/amount-max-button/index.js similarity index 100% rename from ui/app/components/send/send-content/send-amount-row/amount-max-button/index.js rename to ui/app/components/app/send/send-content/send-amount-row/amount-max-button/index.js diff --git a/ui/app/components/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-component.test.js b/ui/app/components/app/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-component.test.js similarity index 100% rename from ui/app/components/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-component.test.js rename to ui/app/components/app/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-component.test.js diff --git a/ui/app/components/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-container.test.js b/ui/app/components/app/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-container.test.js similarity index 95% rename from ui/app/components/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-container.test.js rename to ui/app/components/app/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-container.test.js index 2cc00d6d6de6..f446e330c7bd 100644 --- a/ui/app/components/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-container.test.js +++ b/ui/app/components/app/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-container.test.js @@ -29,8 +29,8 @@ proxyquire('../amount-max-button.container.js', { }, './amount-max-button.selectors.js': { getMaxModeOn: (s) => `mockMaxModeOn:${s}` }, './amount-max-button.utils.js': { calcMaxAmount: (mockObj) => mockObj.val + 1 }, - '../../../../../actions': actionSpies, - '../../../../../ducks/send.duck': duckActionSpies, + '../../../../../../store/actions': actionSpies, + '../../../../../../ducks/send/send.duck': duckActionSpies, }) describe('amount-max-button container', () => { diff --git a/ui/app/components/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-selectors.test.js b/ui/app/components/app/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-selectors.test.js similarity index 100% rename from ui/app/components/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-selectors.test.js rename to ui/app/components/app/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-selectors.test.js diff --git a/ui/app/components/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-utils.test.js b/ui/app/components/app/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-utils.test.js similarity index 100% rename from ui/app/components/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-utils.test.js rename to ui/app/components/app/send/send-content/send-amount-row/amount-max-button/tests/amount-max-button-utils.test.js diff --git a/ui/app/components/send/send-content/send-amount-row/index.js b/ui/app/components/app/send/send-content/send-amount-row/index.js similarity index 100% rename from ui/app/components/send/send-content/send-amount-row/index.js rename to ui/app/components/app/send/send-content/send-amount-row/index.js diff --git a/ui/app/components/send/send-content/send-amount-row/send-amount-row.component.js b/ui/app/components/app/send/send-content/send-amount-row/send-amount-row.component.js similarity index 96% rename from ui/app/components/send/send-content/send-amount-row/send-amount-row.component.js rename to ui/app/components/app/send/send-content/send-amount-row/send-amount-row.component.js index 4df1e0ffa219..e725e7edab32 100644 --- a/ui/app/components/send/send-content/send-amount-row/send-amount-row.component.js +++ b/ui/app/components/app/send/send-content/send-amount-row/send-amount-row.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import SendRowWrapper from '../send-row-wrapper/' -import AmountMaxButton from './amount-max-button/' +import SendRowWrapper from '../send-row-wrapper' +import AmountMaxButton from './amount-max-button' import UserPreferencedCurrencyInput from '../../../user-preferenced-currency-input' import UserPreferencedTokenInput from '../../../user-preferenced-token-input' diff --git a/ui/app/components/send/send-content/send-amount-row/send-amount-row.container.js b/ui/app/components/app/send/send-content/send-amount-row/send-amount-row.container.js similarity index 94% rename from ui/app/components/send/send-content/send-amount-row/send-amount-row.container.js rename to ui/app/components/app/send/send-content/send-amount-row/send-amount-row.container.js index 2b6fe0f6c1c8..0646355ab570 100644 --- a/ui/app/components/send/send-content/send-amount-row/send-amount-row.container.js +++ b/ui/app/components/app/send/send-content/send-amount-row/send-amount-row.container.js @@ -17,10 +17,10 @@ import { getAmountErrorObject, getGasFeeErrorObject } from '../../send.utils' import { setMaxModeTo, updateSendAmount, -} from '../../../../actions' +} from '../../../../../store/actions' import { updateSendErrors, -} from '../../../../ducks/send.duck' +} from '../../../../../ducks/send/send.duck' import SendAmountRow from './send-amount-row.component' export default connect(mapStateToProps, mapDispatchToProps)(SendAmountRow) diff --git a/ui/app/components/send/send-content/send-amount-row/send-amount-row.scss b/ui/app/components/app/send/send-content/send-amount-row/send-amount-row.scss similarity index 100% rename from ui/app/components/send/send-content/send-amount-row/send-amount-row.scss rename to ui/app/components/app/send/send-content/send-amount-row/send-amount-row.scss diff --git a/ui/app/components/send/send-content/send-amount-row/send-amount-row.selectors.js b/ui/app/components/app/send/send-content/send-amount-row/send-amount-row.selectors.js similarity index 100% rename from ui/app/components/send/send-content/send-amount-row/send-amount-row.selectors.js rename to ui/app/components/app/send/send-content/send-amount-row/send-amount-row.selectors.js diff --git a/ui/app/components/send/send-content/send-amount-row/tests/send-amount-row-component.test.js b/ui/app/components/app/send/send-content/send-amount-row/tests/send-amount-row-component.test.js similarity index 100% rename from ui/app/components/send/send-content/send-amount-row/tests/send-amount-row-component.test.js rename to ui/app/components/app/send/send-content/send-amount-row/tests/send-amount-row-component.test.js diff --git a/ui/app/components/send/send-content/send-amount-row/tests/send-amount-row-container.test.js b/ui/app/components/app/send/send-content/send-amount-row/tests/send-amount-row-container.test.js similarity index 97% rename from ui/app/components/send/send-content/send-amount-row/tests/send-amount-row-container.test.js rename to ui/app/components/app/send/send-content/send-amount-row/tests/send-amount-row-container.test.js index 52e351aeea33..6d20202b0cc5 100644 --- a/ui/app/components/send/send-content/send-amount-row/tests/send-amount-row-container.test.js +++ b/ui/app/components/app/send/send-content/send-amount-row/tests/send-amount-row-container.test.js @@ -37,8 +37,8 @@ proxyquire('../send-amount-row.container.js', { getAmountErrorObject: (mockDataObject) => ({ ...mockDataObject, mockChange: true }), getGasFeeErrorObject: (mockDataObject) => ({ ...mockDataObject, mockGasFeeErrorChange: true }), }, - '../../../../actions': actionSpies, - '../../../../ducks/send.duck': duckActionSpies, + '../../../../../store/actions': actionSpies, + '../../../../../ducks/send/send.duck': duckActionSpies, }) describe('send-amount-row container', () => { diff --git a/ui/app/components/send/send-content/send-amount-row/tests/send-amount-row-selectors.test.js b/ui/app/components/app/send/send-content/send-amount-row/tests/send-amount-row-selectors.test.js similarity index 100% rename from ui/app/components/send/send-content/send-amount-row/tests/send-amount-row-selectors.test.js rename to ui/app/components/app/send/send-content/send-amount-row/tests/send-amount-row-selectors.test.js diff --git a/ui/app/components/send/send-content/send-content.component.js b/ui/app/components/app/send/send-content/send-content.component.js similarity index 77% rename from ui/app/components/send/send-content/send-content.component.js rename to ui/app/components/app/send/send-content/send-content.component.js index c780c88f52e1..2c09ceb191d5 100644 --- a/ui/app/components/send/send-content/send-content.component.js +++ b/ui/app/components/app/send/send-content/send-content.component.js @@ -1,11 +1,11 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import PageContainerContent from '../../page-container/page-container-content.component' -import SendAmountRow from './send-amount-row/' -import SendFromRow from './send-from-row/' -import SendGasRow from './send-gas-row/' +import PageContainerContent from '../../../ui/page-container/page-container-content.component' +import SendAmountRow from './send-amount-row' +import SendFromRow from './send-from-row' +import SendGasRow from './send-gas-row' import SendHexDataRow from './send-hex-data-row' -import SendToRow from './send-to-row/' +import SendToRow from './send-to-row' export default class SendContent extends Component { diff --git a/ui/app/components/send/send-content/send-dropdown-list/index.js b/ui/app/components/app/send/send-content/send-dropdown-list/index.js similarity index 100% rename from ui/app/components/send/send-content/send-dropdown-list/index.js rename to ui/app/components/app/send/send-content/send-dropdown-list/index.js diff --git a/ui/app/components/send/send-content/send-dropdown-list/send-dropdown-list.component.js b/ui/app/components/app/send/send-content/send-dropdown-list/send-dropdown-list.component.js similarity index 95% rename from ui/app/components/send/send-content/send-dropdown-list/send-dropdown-list.component.js rename to ui/app/components/app/send/send-content/send-dropdown-list/send-dropdown-list.component.js index bedac1259827..0d026bc69dfe 100644 --- a/ui/app/components/send/send-content/send-dropdown-list/send-dropdown-list.component.js +++ b/ui/app/components/app/send/send-content/send-dropdown-list/send-dropdown-list.component.js @@ -1,6 +1,6 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import AccountListItem from '../../account-list-item/' +import AccountListItem from '../../account-list-item' export default class SendDropdownList extends Component { diff --git a/ui/app/components/send/send-content/send-dropdown-list/tests/send-dropdown-list-component.test.js b/ui/app/components/app/send/send-content/send-dropdown-list/tests/send-dropdown-list-component.test.js similarity index 100% rename from ui/app/components/send/send-content/send-dropdown-list/tests/send-dropdown-list-component.test.js rename to ui/app/components/app/send/send-content/send-dropdown-list/tests/send-dropdown-list-component.test.js diff --git a/ui/app/components/send/send-content/send-from-row/index.js b/ui/app/components/app/send/send-content/send-from-row/index.js similarity index 100% rename from ui/app/components/send/send-content/send-from-row/index.js rename to ui/app/components/app/send/send-content/send-from-row/index.js diff --git a/ui/app/components/send/send-content/send-from-row/send-from-row.component.js b/ui/app/components/app/send/send-content/send-from-row/send-from-row.component.js similarity index 92% rename from ui/app/components/send/send-content/send-from-row/send-from-row.component.js rename to ui/app/components/app/send/send-content/send-from-row/send-from-row.component.js index f8aa084d8198..dfa53e970987 100644 --- a/ui/app/components/send/send-content/send-from-row/send-from-row.component.js +++ b/ui/app/components/app/send/send-content/send-from-row/send-from-row.component.js @@ -1,6 +1,6 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import SendRowWrapper from '../send-row-wrapper/' +import SendRowWrapper from '../send-row-wrapper' import AccountListItem from '../../account-list-item' export default class SendFromRow extends Component { diff --git a/ui/app/components/send/send-content/send-from-row/send-from-row.container.js b/ui/app/components/app/send/send-content/send-from-row/send-from-row.container.js similarity index 100% rename from ui/app/components/send/send-content/send-from-row/send-from-row.container.js rename to ui/app/components/app/send/send-content/send-from-row/send-from-row.container.js diff --git a/ui/app/components/send/send-content/send-from-row/send-from-row.selectors.js b/ui/app/components/app/send/send-content/send-from-row/send-from-row.selectors.js similarity index 100% rename from ui/app/components/send/send-content/send-from-row/send-from-row.selectors.js rename to ui/app/components/app/send/send-content/send-from-row/send-from-row.selectors.js diff --git a/ui/app/components/send/send-content/send-from-row/tests/send-from-row-component.test.js b/ui/app/components/app/send/send-content/send-from-row/tests/send-from-row-component.test.js similarity index 100% rename from ui/app/components/send/send-content/send-from-row/tests/send-from-row-component.test.js rename to ui/app/components/app/send/send-content/send-from-row/tests/send-from-row-component.test.js diff --git a/ui/app/components/send/send-content/send-from-row/tests/send-from-row-container.test.js b/ui/app/components/app/send/send-content/send-from-row/tests/send-from-row-container.test.js similarity index 100% rename from ui/app/components/send/send-content/send-from-row/tests/send-from-row-container.test.js rename to ui/app/components/app/send/send-content/send-from-row/tests/send-from-row-container.test.js diff --git a/ui/app/components/send/send-content/send-from-row/tests/send-from-row-selectors.test.js b/ui/app/components/app/send/send-content/send-from-row/tests/send-from-row-selectors.test.js similarity index 100% rename from ui/app/components/send/send-content/send-from-row/tests/send-from-row-selectors.test.js rename to ui/app/components/app/send/send-content/send-from-row/tests/send-from-row-selectors.test.js diff --git a/ui/app/components/send/send-content/send-gas-row/README.md b/ui/app/components/app/send/send-content/send-gas-row/README.md similarity index 100% rename from ui/app/components/send/send-content/send-gas-row/README.md rename to ui/app/components/app/send/send-content/send-gas-row/README.md diff --git a/ui/app/components/send/send-content/send-gas-row/gas-fee-display/gas-fee-display.component.js b/ui/app/components/app/send/send-content/send-gas-row/gas-fee-display/gas-fee-display.component.js similarity index 95% rename from ui/app/components/send/send-content/send-gas-row/gas-fee-display/gas-fee-display.component.js rename to ui/app/components/app/send/send-content/send-gas-row/gas-fee-display/gas-fee-display.component.js index b667aa03795f..48088607a4f3 100644 --- a/ui/app/components/send/send-content/send-gas-row/gas-fee-display/gas-fee-display.component.js +++ b/ui/app/components/app/send/send-content/send-gas-row/gas-fee-display/gas-fee-display.component.js @@ -1,7 +1,7 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import UserPreferencedCurrencyDisplay from '../../../../user-preferenced-currency-display' -import { PRIMARY, SECONDARY } from '../../../../../constants/common' +import { PRIMARY, SECONDARY } from '../../../../../../helpers/constants/common' export default class GasFeeDisplay extends Component { diff --git a/ui/app/components/send/send-content/send-gas-row/gas-fee-display/index.js b/ui/app/components/app/send/send-content/send-gas-row/gas-fee-display/index.js similarity index 100% rename from ui/app/components/send/send-content/send-gas-row/gas-fee-display/index.js rename to ui/app/components/app/send/send-content/send-gas-row/gas-fee-display/index.js diff --git a/ui/app/components/send/send-content/send-gas-row/gas-fee-display/test/gas-fee-display.component.test.js b/ui/app/components/app/send/send-content/send-gas-row/gas-fee-display/test/gas-fee-display.component.test.js similarity index 100% rename from ui/app/components/send/send-content/send-gas-row/gas-fee-display/test/gas-fee-display.component.test.js rename to ui/app/components/app/send/send-content/send-gas-row/gas-fee-display/test/gas-fee-display.component.test.js diff --git a/ui/app/components/send/send-content/send-gas-row/index.js b/ui/app/components/app/send/send-content/send-gas-row/index.js similarity index 100% rename from ui/app/components/send/send-content/send-gas-row/index.js rename to ui/app/components/app/send/send-content/send-gas-row/index.js diff --git a/ui/app/components/send/send-content/send-gas-row/send-gas-row.component.js b/ui/app/components/app/send/send-content/send-gas-row/send-gas-row.component.js similarity index 98% rename from ui/app/components/send/send-content/send-gas-row/send-gas-row.component.js rename to ui/app/components/app/send/send-content/send-gas-row/send-gas-row.component.js index bf744662685c..424a65b20ee9 100644 --- a/ui/app/components/send/send-content/send-gas-row/send-gas-row.component.js +++ b/ui/app/components/app/send/send-content/send-gas-row/send-gas-row.component.js @@ -1,6 +1,6 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import SendRowWrapper from '../send-row-wrapper/' +import SendRowWrapper from '../send-row-wrapper' import GasFeeDisplay from './gas-fee-display/gas-fee-display.component' import GasPriceButtonGroup from '../../../gas-customization/gas-price-button-group' import AdvancedGasInputs from '../../../gas-customization/advanced-gas-inputs' diff --git a/ui/app/components/send/send-content/send-gas-row/send-gas-row.container.js b/ui/app/components/app/send/send-content/send-gas-row/send-gas-row.container.js similarity index 94% rename from ui/app/components/send/send-content/send-gas-row/send-gas-row.container.js rename to ui/app/components/app/send/send-content/send-gas-row/send-gas-row.container.js index a187d61a2b1a..f81670c02a61 100644 --- a/ui/app/components/send/send-content/send-gas-row/send-gas-row.container.js +++ b/ui/app/components/app/send/send-content/send-gas-row/send-gas-row.container.js @@ -15,18 +15,18 @@ import { getBasicGasEstimateLoadingStatus, getRenderableEstimateDataForSmallButtonsFromGWEI, getDefaultActiveButtonIndex, -} from '../../../../selectors/custom-gas' +} from '../../../../../selectors/custom-gas' import { showGasButtonGroup, -} from '../../../../ducks/send.duck' +} from '../../../../../ducks/send/send.duck' import { resetCustomData, setCustomGasPrice, setCustomGasLimit, -} from '../../../../ducks/gas.duck' +} from '../../../../../ducks/gas/gas.duck' import { getGasLoadingError, gasFeeIsInError, getGasButtonGroupShown } from './send-gas-row.selectors.js' -import { showModal, setGasPrice, setGasLimit, setGasTotal } from '../../../../actions' -import { getAdvancedInlineGasShown, getCurrentEthBalance, getSelectedToken } from '../../../../selectors' +import { showModal, setGasPrice, setGasLimit, setGasTotal } from '../../../../../store/actions' +import { getAdvancedInlineGasShown, getCurrentEthBalance, getSelectedToken } from '../../../../../selectors/selectors' import SendGasRow from './send-gas-row.component' export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(SendGasRow) diff --git a/ui/app/components/send/send-content/send-gas-row/send-gas-row.scss b/ui/app/components/app/send/send-content/send-gas-row/send-gas-row.scss similarity index 100% rename from ui/app/components/send/send-content/send-gas-row/send-gas-row.scss rename to ui/app/components/app/send/send-content/send-gas-row/send-gas-row.scss diff --git a/ui/app/components/send/send-content/send-gas-row/send-gas-row.selectors.js b/ui/app/components/app/send/send-content/send-gas-row/send-gas-row.selectors.js similarity index 100% rename from ui/app/components/send/send-content/send-gas-row/send-gas-row.selectors.js rename to ui/app/components/app/send/send-content/send-gas-row/send-gas-row.selectors.js diff --git a/ui/app/components/send/send-content/send-gas-row/tests/send-gas-row-component.test.js b/ui/app/components/app/send/send-content/send-gas-row/tests/send-gas-row-component.test.js similarity index 100% rename from ui/app/components/send/send-content/send-gas-row/tests/send-gas-row-component.test.js rename to ui/app/components/app/send/send-content/send-gas-row/tests/send-gas-row-component.test.js diff --git a/ui/app/components/send/send-content/send-gas-row/tests/send-gas-row-container.test.js b/ui/app/components/app/send/send-content/send-gas-row/tests/send-gas-row-container.test.js similarity index 96% rename from ui/app/components/send/send-content/send-gas-row/tests/send-gas-row-container.test.js rename to ui/app/components/app/send/send-content/send-gas-row/tests/send-gas-row-container.test.js index 12e78657b1d5..d1f75363960e 100644 --- a/ui/app/components/send/send-content/send-gas-row/tests/send-gas-row-container.test.js +++ b/ui/app/components/app/send/send-content/send-gas-row/tests/send-gas-row-container.test.js @@ -32,7 +32,7 @@ proxyquire('../send-gas-row.container.js', { return () => ({}) }, }, - '../../../../selectors': { + '../../../../../selectors/selectors': { getCurrentEthBalance: (s) => `mockCurrentEthBalance:${s}`, getAdvancedInlineGasShown: (s) => `mockAdvancedInlineGasShown:${s}`, getSelectedToken: () => false, @@ -59,14 +59,14 @@ proxyquire('../send-gas-row.container.js', { gasFeeIsInError: (s) => `mockGasFeeError:${s}`, getGasButtonGroupShown: (s) => `mockGetGasButtonGroupShown:${s}`, }, - '../../../../actions': actionSpies, - '../../../../selectors/custom-gas': { + '../../../../../store/actions': actionSpies, + '../../../../../selectors/custom-gas': { getBasicGasEstimateLoadingStatus: (s) => `mockBasicGasEstimateLoadingStatus:${s}`, getRenderableEstimateDataForSmallButtonsFromGWEI: (s) => `mockGasButtonInfo:${s}`, getDefaultActiveButtonIndex: (gasButtonInfo, gasPrice) => gasButtonInfo.length + gasPrice.length, }, - '../../../../ducks/send.duck': sendDuckSpies, - '../../../../ducks/gas.duck': gasDuckSpies, + '../../../../../ducks/send/send.duck': sendDuckSpies, + '../../../../../ducks/gas/gas.duck': gasDuckSpies, }) describe('send-gas-row container', () => { diff --git a/ui/app/components/send/send-content/send-gas-row/tests/send-gas-row-selectors.test.js b/ui/app/components/app/send/send-content/send-gas-row/tests/send-gas-row-selectors.test.js similarity index 100% rename from ui/app/components/send/send-content/send-gas-row/tests/send-gas-row-selectors.test.js rename to ui/app/components/app/send/send-content/send-gas-row/tests/send-gas-row-selectors.test.js diff --git a/ui/app/components/send/send-content/send-hex-data-row/index.js b/ui/app/components/app/send/send-content/send-hex-data-row/index.js similarity index 100% rename from ui/app/components/send/send-content/send-hex-data-row/index.js rename to ui/app/components/app/send/send-content/send-hex-data-row/index.js diff --git a/ui/app/components/send/send-content/send-hex-data-row/send-hex-data-row.component.js b/ui/app/components/app/send/send-content/send-hex-data-row/send-hex-data-row.component.js similarity index 100% rename from ui/app/components/send/send-content/send-hex-data-row/send-hex-data-row.component.js rename to ui/app/components/app/send/send-content/send-hex-data-row/send-hex-data-row.component.js diff --git a/ui/app/components/send/send-content/send-hex-data-row/send-hex-data-row.container.js b/ui/app/components/app/send/send-content/send-hex-data-row/send-hex-data-row.container.js similarity index 92% rename from ui/app/components/send/send-content/send-hex-data-row/send-hex-data-row.container.js rename to ui/app/components/app/send/send-content/send-hex-data-row/send-hex-data-row.container.js index df554ca5f43b..76c929d082af 100644 --- a/ui/app/components/send/send-content/send-hex-data-row/send-hex-data-row.container.js +++ b/ui/app/components/app/send/send-content/send-hex-data-row/send-hex-data-row.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import { updateSendHexData, -} from '../../../../actions' +} from '../../../../../store/actions' import SendHexDataRow from './send-hex-data-row.component' export default connect(mapStateToProps, mapDispatchToProps)(SendHexDataRow) diff --git a/ui/app/components/send/send-content/send-row-wrapper/index.js b/ui/app/components/app/send/send-content/send-row-wrapper/index.js similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/index.js rename to ui/app/components/app/send/send-content/send-row-wrapper/index.js diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/index.js b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/index.js similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/index.js rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/index.js diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message-README.md b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message-README.md similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message-README.md rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message-README.md diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.component.js b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.component.js similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.component.js rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.component.js diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.container.js b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.container.js similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.container.js rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.container.js diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.scss b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.scss similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.scss rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/send-row-error-message.scss diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/tests/send-row-error-message-component.test.js b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/tests/send-row-error-message-component.test.js similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/tests/send-row-error-message-component.test.js rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/tests/send-row-error-message-component.test.js diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/tests/send-row-error-message-container.test.js b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/tests/send-row-error-message-container.test.js similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-error-message/tests/send-row-error-message-container.test.js rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-error-message/tests/send-row-error-message-container.test.js diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-warning-message/index.js b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-warning-message/index.js similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-warning-message/index.js rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-warning-message/index.js diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.component.js b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.component.js similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.component.js rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.component.js diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.container.js b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.container.js similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.container.js rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.container.js diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.scss b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.scss similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.scss rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-warning-message/send-row-warning-message.scss diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-warning-message/tests/send-row-warning-message-component.test.js b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-warning-message/tests/send-row-warning-message-component.test.js similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-warning-message/tests/send-row-warning-message-component.test.js rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-warning-message/tests/send-row-warning-message-component.test.js diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-warning-message/tests/send-row-warning-message-container.test.js b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-warning-message/tests/send-row-warning-message-container.test.js similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-warning-message/tests/send-row-warning-message-container.test.js rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-warning-message/tests/send-row-warning-message-container.test.js diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-wrapper-README.md b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-wrapper-README.md similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-wrapper-README.md rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-wrapper-README.md diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-wrapper.component.js b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-wrapper.component.js similarity index 90% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-wrapper.component.js rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-wrapper.component.js index 0146ce6452ac..94309bd96e20 100644 --- a/ui/app/components/send/send-content/send-row-wrapper/send-row-wrapper.component.js +++ b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-wrapper.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import SendRowErrorMessage from './send-row-error-message/' -import SendRowWarningMessage from './send-row-warning-message/' +import SendRowErrorMessage from './send-row-error-message' +import SendRowWarningMessage from './send-row-warning-message' export default class SendRowWrapper extends Component { diff --git a/ui/app/components/send/send-content/send-row-wrapper/send-row-wrapper.scss b/ui/app/components/app/send/send-content/send-row-wrapper/send-row-wrapper.scss similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/send-row-wrapper.scss rename to ui/app/components/app/send/send-content/send-row-wrapper/send-row-wrapper.scss diff --git a/ui/app/components/send/send-content/send-row-wrapper/tests/send-row-wrapper-component.test.js b/ui/app/components/app/send/send-content/send-row-wrapper/tests/send-row-wrapper-component.test.js similarity index 100% rename from ui/app/components/send/send-content/send-row-wrapper/tests/send-row-wrapper-component.test.js rename to ui/app/components/app/send/send-content/send-row-wrapper/tests/send-row-wrapper-component.test.js diff --git a/ui/app/components/send/send-content/send-to-row/index.js b/ui/app/components/app/send/send-content/send-to-row/index.js similarity index 100% rename from ui/app/components/send/send-content/send-to-row/index.js rename to ui/app/components/app/send/send-content/send-to-row/index.js diff --git a/ui/app/components/send/send-content/send-to-row/send-to-row-README.md b/ui/app/components/app/send/send-content/send-to-row/send-to-row-README.md similarity index 100% rename from ui/app/components/send/send-content/send-to-row/send-to-row-README.md rename to ui/app/components/app/send/send-content/send-to-row/send-to-row-README.md diff --git a/ui/app/components/send/send-content/send-to-row/send-to-row.component.js b/ui/app/components/app/send/send-content/send-to-row/send-to-row.component.js similarity index 98% rename from ui/app/components/send/send-content/send-to-row/send-to-row.component.js rename to ui/app/components/app/send/send-content/send-to-row/send-to-row.component.js index 434204490815..e8a55cb2acad 100644 --- a/ui/app/components/send/send-content/send-to-row/send-to-row.component.js +++ b/ui/app/components/app/send/send-content/send-to-row/send-to-row.component.js @@ -1,6 +1,6 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import SendRowWrapper from '../send-row-wrapper/' +import SendRowWrapper from '../send-row-wrapper' import EnsInput from '../../../ens-input' import { getToErrorObject, getToWarningObject } from './send-to-row.utils.js' diff --git a/ui/app/components/send/send-content/send-to-row/send-to-row.container.js b/ui/app/components/app/send/send-content/send-to-row/send-to-row.container.js similarity index 94% rename from ui/app/components/send/send-content/send-to-row/send-to-row.container.js rename to ui/app/components/app/send/send-content/send-to-row/send-to-row.container.js index fc6742df0d0d..30865d295fcc 100644 --- a/ui/app/components/send/send-content/send-to-row/send-to-row.container.js +++ b/ui/app/components/app/send/send-content/send-to-row/send-to-row.container.js @@ -14,13 +14,13 @@ import { } from './send-to-row.selectors.js' import { updateSendTo, -} from '../../../../actions' +} from '../../../../../store/actions' import { updateSendErrors, updateSendWarnings, openToDropdown, closeToDropdown, -} from '../../../../ducks/send.duck' +} from '../../../../../ducks/send/send.duck' import SendToRow from './send-to-row.component' export default connect(mapStateToProps, mapDispatchToProps)(SendToRow) diff --git a/ui/app/components/send/send-content/send-to-row/send-to-row.selectors.js b/ui/app/components/app/send/send-content/send-to-row/send-to-row.selectors.js similarity index 100% rename from ui/app/components/send/send-content/send-to-row/send-to-row.selectors.js rename to ui/app/components/app/send/send-content/send-to-row/send-to-row.selectors.js diff --git a/ui/app/components/send/send-content/send-to-row/send-to-row.utils.js b/ui/app/components/app/send/send-content/send-to-row/send-to-row.utils.js similarity index 87% rename from ui/app/components/send/send-content/send-to-row/send-to-row.utils.js rename to ui/app/components/app/send/send-content/send-to-row/send-to-row.utils.js index 2bd3ea45e66c..60e75d34c543 100644 --- a/ui/app/components/send/send-content/send-to-row/send-to-row.utils.js +++ b/ui/app/components/app/send/send-content/send-to-row/send-to-row.utils.js @@ -4,8 +4,8 @@ const { KNOWN_RECIPIENT_ADDRESS_ERROR, INVALID_RECIPIENT_ADDRESS_NOT_ETH_NETWORK_ERROR, } = require('../../send.constants') -const { isValidAddress, isEthNetwork } = require('../../../../util') -import { checkExistingAddresses } from '../../../pages/add-token/util' +const { isValidAddress, isEthNetwork } = require('../../../../../helpers/utils/util') +import { checkExistingAddresses } from '../../../../../pages/add-token/util' const ethUtil = require('ethereumjs-util') const contractMap = require('eth-contract-metadata') diff --git a/ui/app/components/send/send-content/send-to-row/tests/send-to-row-component.test.js b/ui/app/components/app/send/send-content/send-to-row/tests/send-to-row-component.test.js similarity index 100% rename from ui/app/components/send/send-content/send-to-row/tests/send-to-row-component.test.js rename to ui/app/components/app/send/send-content/send-to-row/tests/send-to-row-component.test.js diff --git a/ui/app/components/send/send-content/send-to-row/tests/send-to-row-container.test.js b/ui/app/components/app/send/send-content/send-to-row/tests/send-to-row-container.test.js similarity index 97% rename from ui/app/components/send/send-content/send-to-row/tests/send-to-row-container.test.js rename to ui/app/components/app/send/send-content/send-to-row/tests/send-to-row-container.test.js index aa09f01a95b6..94b4f1024a50 100644 --- a/ui/app/components/send/send-content/send-to-row/tests/send-to-row-container.test.js +++ b/ui/app/components/app/send/send-content/send-to-row/tests/send-to-row-container.test.js @@ -36,8 +36,8 @@ proxyquire('../send-to-row.container.js', { sendToIsInWarning: (s) => `mockInWarning:${s}`, getTokens: (s) => `mockTokens:${s}`, }, - '../../../../actions': actionSpies, - '../../../../ducks/send.duck': duckActionSpies, + '../../../../../store/actions': actionSpies, + '../../../../../ducks/send/send.duck': duckActionSpies, }) describe('send-to-row container', () => { diff --git a/ui/app/components/send/send-content/send-to-row/tests/send-to-row-selectors.test.js b/ui/app/components/app/send/send-content/send-to-row/tests/send-to-row-selectors.test.js similarity index 100% rename from ui/app/components/send/send-content/send-to-row/tests/send-to-row-selectors.test.js rename to ui/app/components/app/send/send-content/send-to-row/tests/send-to-row-selectors.test.js diff --git a/ui/app/components/send/send-content/send-to-row/tests/send-to-row-utils.test.js b/ui/app/components/app/send/send-content/send-to-row/tests/send-to-row-utils.test.js similarity index 98% rename from ui/app/components/send/send-content/send-to-row/tests/send-to-row-utils.test.js rename to ui/app/components/app/send/send-content/send-to-row/tests/send-to-row-utils.test.js index f6abb26e64c5..95882d640cb5 100644 --- a/ui/app/components/send/send-content/send-to-row/tests/send-to-row-utils.test.js +++ b/ui/app/components/app/send/send-content/send-to-row/tests/send-to-row-utils.test.js @@ -13,7 +13,7 @@ const stubs = { } const toRowUtils = proxyquire('../send-to-row.utils.js', { - '../../../../util': { + '../../../../../helpers/utils/util': { isValidAddress: stubs.isValidAddress, }, }) diff --git a/ui/app/components/send/send-content/tests/send-content-component.test.js b/ui/app/components/app/send/send-content/tests/send-content-component.test.js similarity index 95% rename from ui/app/components/send/send-content/tests/send-content-component.test.js rename to ui/app/components/app/send/send-content/tests/send-content-component.test.js index c5a11c8bb522..7d102c930241 100644 --- a/ui/app/components/send/send-content/tests/send-content-component.test.js +++ b/ui/app/components/app/send/send-content/tests/send-content-component.test.js @@ -3,7 +3,7 @@ import assert from 'assert' import { shallow } from 'enzyme' import SendContent from '../send-content.component.js' -import PageContainerContent from '../../../page-container/page-container-content.component' +import PageContainerContent from '../../../../ui/page-container/page-container-content.component' import SendAmountRow from '../send-amount-row/send-amount-row.container' import SendFromRow from '../send-from-row/send-from-row.container' import SendGasRow from '../send-gas-row/send-gas-row.container' diff --git a/ui/app/components/send/send-footer/README.md b/ui/app/components/app/send/send-footer/README.md similarity index 100% rename from ui/app/components/send/send-footer/README.md rename to ui/app/components/app/send/send-footer/README.md diff --git a/ui/app/components/send/send-footer/index.js b/ui/app/components/app/send/send-footer/index.js similarity index 100% rename from ui/app/components/send/send-footer/index.js rename to ui/app/components/app/send/send-footer/index.js diff --git a/ui/app/components/send/send-footer/send-footer.component.js b/ui/app/components/app/send/send-footer/send-footer.component.js similarity index 96% rename from ui/app/components/send/send-footer/send-footer.component.js rename to ui/app/components/app/send/send-footer/send-footer.component.js index d943b4b2274e..cc891a9b317d 100644 --- a/ui/app/components/send/send-footer/send-footer.component.js +++ b/ui/app/components/app/send/send-footer/send-footer.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import PageContainerFooter from '../../page-container/page-container-footer' -import { CONFIRM_TRANSACTION_ROUTE, DEFAULT_ROUTE } from '../../../routes' +import PageContainerFooter from '../../../ui/page-container/page-container-footer' +import { CONFIRM_TRANSACTION_ROUTE, DEFAULT_ROUTE } from '../../../../helpers/constants/routes' export default class SendFooter extends Component { diff --git a/ui/app/components/send/send-footer/send-footer.container.js b/ui/app/components/app/send/send-footer/send-footer.container.js similarity index 98% rename from ui/app/components/send/send-footer/send-footer.container.js rename to ui/app/components/app/send/send-footer/send-footer.container.js index 0c6120cc5a54..502159a8168a 100644 --- a/ui/app/components/send/send-footer/send-footer.container.js +++ b/ui/app/components/app/send/send-footer/send-footer.container.js @@ -6,7 +6,7 @@ import { signTokenTx, signTx, updateTransaction, -} from '../../../actions' +} from '../../../../store/actions' import SendFooter from './send-footer.component' import { getGasLimit, diff --git a/ui/app/components/send/send-footer/send-footer.scss b/ui/app/components/app/send/send-footer/send-footer.scss similarity index 100% rename from ui/app/components/send/send-footer/send-footer.scss rename to ui/app/components/app/send/send-footer/send-footer.scss diff --git a/ui/app/components/send/send-footer/send-footer.selectors.js b/ui/app/components/app/send/send-footer/send-footer.selectors.js similarity index 100% rename from ui/app/components/send/send-footer/send-footer.selectors.js rename to ui/app/components/app/send/send-footer/send-footer.selectors.js diff --git a/ui/app/components/send/send-footer/send-footer.utils.js b/ui/app/components/app/send/send-footer/send-footer.utils.js similarity index 100% rename from ui/app/components/send/send-footer/send-footer.utils.js rename to ui/app/components/app/send/send-footer/send-footer.utils.js diff --git a/ui/app/components/send/send-footer/tests/send-footer-component.test.js b/ui/app/components/app/send/send-footer/tests/send-footer-component.test.js similarity index 98% rename from ui/app/components/send/send-footer/tests/send-footer-component.test.js rename to ui/app/components/app/send/send-footer/tests/send-footer-component.test.js index 4b63e422da53..6683ca8c0bc0 100644 --- a/ui/app/components/send/send-footer/tests/send-footer-component.test.js +++ b/ui/app/components/app/send/send-footer/tests/send-footer-component.test.js @@ -2,10 +2,10 @@ import React from 'react' import assert from 'assert' import { shallow } from 'enzyme' import sinon from 'sinon' -import { CONFIRM_TRANSACTION_ROUTE, DEFAULT_ROUTE } from '../../../../routes' +import { CONFIRM_TRANSACTION_ROUTE, DEFAULT_ROUTE } from '../../../../../helpers/constants/routes' import SendFooter from '../send-footer.component.js' -import PageContainerFooter from '../../../page-container/page-container-footer' +import PageContainerFooter from '../../../../ui/page-container/page-container-footer' const propsMethodSpies = { addToAddressBookIfNew: sinon.spy(), diff --git a/ui/app/components/send/send-footer/tests/send-footer-container.test.js b/ui/app/components/app/send/send-footer/tests/send-footer-container.test.js similarity index 99% rename from ui/app/components/send/send-footer/tests/send-footer-container.test.js rename to ui/app/components/app/send/send-footer/tests/send-footer-container.test.js index 70cb28df34a2..878b0aa19f8a 100644 --- a/ui/app/components/send/send-footer/tests/send-footer-container.test.js +++ b/ui/app/components/app/send/send-footer/tests/send-footer-container.test.js @@ -28,7 +28,7 @@ proxyquire('../send-footer.container.js', { return () => ({}) }, }, - '../../../actions': actionSpies, + '../../../../store/actions': actionSpies, '../send.selectors': { getGasLimit: (s) => `mockGasLimit:${s}`, getGasPrice: (s) => `mockGasPrice:${s}`, diff --git a/ui/app/components/send/send-footer/tests/send-footer-selectors.test.js b/ui/app/components/app/send/send-footer/tests/send-footer-selectors.test.js similarity index 100% rename from ui/app/components/send/send-footer/tests/send-footer-selectors.test.js rename to ui/app/components/app/send/send-footer/tests/send-footer-selectors.test.js diff --git a/ui/app/components/send/send-footer/tests/send-footer-utils.test.js b/ui/app/components/app/send/send-footer/tests/send-footer-utils.test.js similarity index 100% rename from ui/app/components/send/send-footer/tests/send-footer-utils.test.js rename to ui/app/components/app/send/send-footer/tests/send-footer-utils.test.js diff --git a/ui/app/components/send/send-header/README.md b/ui/app/components/app/send/send-header/README.md similarity index 100% rename from ui/app/components/send/send-header/README.md rename to ui/app/components/app/send/send-header/README.md diff --git a/ui/app/components/send/send-header/index.js b/ui/app/components/app/send/send-header/index.js similarity index 100% rename from ui/app/components/send/send-header/index.js rename to ui/app/components/app/send/send-header/index.js diff --git a/ui/app/components/send/send-header/send-header.component.js b/ui/app/components/app/send/send-header/send-header.component.js similarity index 81% rename from ui/app/components/send/send-header/send-header.component.js rename to ui/app/components/app/send/send-header/send-header.component.js index efc4bbf27e7a..f216954ef23f 100644 --- a/ui/app/components/send/send-header/send-header.component.js +++ b/ui/app/components/app/send/send-header/send-header.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import PageContainerHeader from '../../page-container/page-container-header' -import { DEFAULT_ROUTE } from '../../../routes' +import PageContainerHeader from '../../../ui/page-container/page-container-header' +import { DEFAULT_ROUTE } from '../../../../helpers/constants/routes' export default class SendHeader extends Component { diff --git a/ui/app/components/send/send-header/send-header.container.js b/ui/app/components/app/send/send-header/send-header.container.js similarity index 89% rename from ui/app/components/send/send-header/send-header.container.js rename to ui/app/components/app/send/send-header/send-header.container.js index 4bcd0d1b6b4e..ce53fba9ac23 100644 --- a/ui/app/components/send/send-header/send-header.container.js +++ b/ui/app/components/app/send/send-header/send-header.container.js @@ -1,5 +1,5 @@ import { connect } from 'react-redux' -import { clearSend } from '../../../actions' +import { clearSend } from '../../../../store/actions' import SendHeader from './send-header.component' import { getSubtitleParams, getTitleKey } from './send-header.selectors' diff --git a/ui/app/components/send/send-header/send-header.selectors.js b/ui/app/components/app/send/send-header/send-header.selectors.js similarity index 100% rename from ui/app/components/send/send-header/send-header.selectors.js rename to ui/app/components/app/send/send-header/send-header.selectors.js diff --git a/ui/app/components/send/send-header/tests/send-header-component.test.js b/ui/app/components/app/send/send-header/tests/send-header-component.test.js similarity index 92% rename from ui/app/components/send/send-header/tests/send-header-component.test.js rename to ui/app/components/app/send/send-header/tests/send-header-component.test.js index 930bfa3876e9..db2ee89670db 100644 --- a/ui/app/components/send/send-header/tests/send-header-component.test.js +++ b/ui/app/components/app/send/send-header/tests/send-header-component.test.js @@ -2,10 +2,10 @@ import React from 'react' import assert from 'assert' import { shallow } from 'enzyme' import sinon from 'sinon' -import { DEFAULT_ROUTE } from '../../../../routes' +import { DEFAULT_ROUTE } from '../../../../../helpers/constants/routes' import SendHeader from '../send-header.component.js' -import PageContainerHeader from '../../../page-container/page-container-header' +import PageContainerHeader from '../../../../ui/page-container/page-container-header' const propsMethodSpies = { clearSend: sinon.spy(), diff --git a/ui/app/components/send/send-header/tests/send-header-container.test.js b/ui/app/components/app/send/send-header/tests/send-header-container.test.js similarity index 96% rename from ui/app/components/send/send-header/tests/send-header-container.test.js rename to ui/app/components/app/send/send-header/tests/send-header-container.test.js index 41a7e8a89bde..634c3424baca 100644 --- a/ui/app/components/send/send-header/tests/send-header-container.test.js +++ b/ui/app/components/app/send/send-header/tests/send-header-container.test.js @@ -17,7 +17,7 @@ proxyquire('../send-header.container.js', { return () => ({}) }, }, - '../../../actions': actionSpies, + '../../../../store/actions': actionSpies, './send-header.selectors': { getTitleKey: (s) => `mockTitleKey:${s}`, getSubtitleParams: (s) => `mockSubtitleParams:${s}`, diff --git a/ui/app/components/send/send-header/tests/send-header-selectors.test.js b/ui/app/components/app/send/send-header/tests/send-header-selectors.test.js similarity index 100% rename from ui/app/components/send/send-header/tests/send-header-selectors.test.js rename to ui/app/components/app/send/send-header/tests/send-header-selectors.test.js diff --git a/ui/app/components/send/send.component.js b/ui/app/components/app/send/send.component.js similarity index 96% rename from ui/app/components/send/send.component.js rename to ui/app/components/app/send/send.component.js index 9b512aaf601b..a38b681b080f 100644 --- a/ui/app/components/send/send.component.js +++ b/ui/app/components/app/send/send.component.js @@ -1,6 +1,6 @@ import React from 'react' import PropTypes from 'prop-types' -import PersistentForm from '../../../lib/persistent-form' +import PersistentForm from '../../../../lib/persistent-form' import { getAmountErrorObject, getGasFeeErrorObject, @@ -8,9 +8,9 @@ import { doesAmountErrorRequireUpdate, } from './send.utils' -import SendHeader from './send-header/' -import SendContent from './send-content/' -import SendFooter from './send-footer/' +import SendHeader from './send-header' +import SendContent from './send-content' +import SendFooter from './send-footer' export default class SendTransactionScreen extends PersistentForm { diff --git a/ui/app/components/send/send.constants.js b/ui/app/components/app/send/send.constants.js similarity index 95% rename from ui/app/components/send/send.constants.js rename to ui/app/components/app/send/send.constants.js index 490bc6fd240f..36549038e260 100644 --- a/ui/app/components/send/send.constants.js +++ b/ui/app/components/app/send/send.constants.js @@ -1,5 +1,5 @@ const ethUtil = require('ethereumjs-util') -const { conversionUtil, multiplyCurrencies } = require('../../conversion-util') +const { conversionUtil, multiplyCurrencies } = require('../../../helpers/utils/conversion-util') const MIN_GAS_PRICE_DEC = '0' const MIN_GAS_PRICE_HEX = (parseInt(MIN_GAS_PRICE_DEC)).toString(16) diff --git a/ui/app/components/send/send.container.js b/ui/app/components/app/send/send.container.js similarity index 95% rename from ui/app/components/send/send.container.js rename to ui/app/components/app/send/send.container.js index 402e4bbe5de0..e65463b9321f 100644 --- a/ui/app/components/send/send.container.js +++ b/ui/app/components/app/send/send.container.js @@ -31,21 +31,21 @@ import { setGasTotal, showQrScanner, qrCodeDetected, -} from '../../actions' +} from '../../../store/actions' import { resetSendState, updateSendErrors, -} from '../../ducks/send.duck' +} from '../../../ducks/send/send.duck' import { fetchBasicGasEstimates, -} from '../../ducks/gas.duck' +} from '../../../ducks/gas/gas.duck' import { calcGasTotal, } from './send.utils.js' import { SEND_ROUTE, -} from '../../routes' +} from '../../../helpers/constants/routes' module.exports = compose( withRouter, diff --git a/ui/app/components/send/send.scss b/ui/app/components/app/send/send.scss similarity index 100% rename from ui/app/components/send/send.scss rename to ui/app/components/app/send/send.scss diff --git a/ui/app/components/send/send.selectors.js b/ui/app/components/app/send/send.selectors.js similarity index 97% rename from ui/app/components/send/send.selectors.js rename to ui/app/components/app/send/send.selectors.js index 47a49500f624..2ec677ad1b73 100644 --- a/ui/app/components/send/send.selectors.js +++ b/ui/app/components/app/send/send.selectors.js @@ -1,18 +1,18 @@ -const { valuesFor } = require('../../util') +const { valuesFor } = require('../../../helpers/utils/util') const abi = require('human-standard-token-abi') const { multiplyCurrencies, -} = require('../../conversion-util') +} = require('../../../helpers/utils/conversion-util') const { getMetaMaskAccounts, -} = require('../../selectors') +} = require('../../../selectors/selectors') const { estimateGasPriceFromRecentBlocks, calcGasTotal, } = require('./send.utils') import { getFastPriceEstimateInHexWEI, -} from '../../selectors/custom-gas' +} from '../../../selectors/custom-gas' const selectors = { accountsWithSendEtherInfoSelector, diff --git a/ui/app/components/send/send.utils.js b/ui/app/components/app/send/send.utils.js similarity index 98% rename from ui/app/components/send/send.utils.js rename to ui/app/components/app/send/send.utils.js index d78b7736f5c4..7609d46ea567 100644 --- a/ui/app/components/send/send.utils.js +++ b/ui/app/components/app/send/send.utils.js @@ -5,10 +5,10 @@ const { multiplyCurrencies, conversionGreaterThan, conversionLessThan, -} = require('../../conversion-util') +} = require('../../../helpers/utils/conversion-util') const { calcTokenAmount, -} = require('../../token-util') +} = require('../../../helpers/utils/token-util') const { BASE_TOKEN_GAS_COST, INSUFFICIENT_FUNDS_ERROR, diff --git a/ui/app/components/send/tests/send-component.test.js b/ui/app/components/app/send/tests/send-component.test.js similarity index 99% rename from ui/app/components/send/tests/send-component.test.js rename to ui/app/components/app/send/tests/send-component.test.js index 81955cc1d2dc..738c148396c2 100644 --- a/ui/app/components/send/tests/send-component.test.js +++ b/ui/app/components/app/send/tests/send-component.test.js @@ -3,7 +3,7 @@ import assert from 'assert' import proxyquire from 'proxyquire' import { shallow } from 'enzyme' import sinon from 'sinon' -import timeout from '../../../../lib/test-timeout' +import timeout from '../../../../../lib/test-timeout' import SendHeader from '../send-header/send-header.container' import SendContent from '../send-content/send-content.component' diff --git a/ui/app/components/send/tests/send-container.test.js b/ui/app/components/app/send/tests/send-container.test.js similarity index 98% rename from ui/app/components/send/tests/send-container.test.js rename to ui/app/components/app/send/tests/send-container.test.js index 19b6563e6812..9538b67b38e5 100644 --- a/ui/app/components/send/tests/send-container.test.js +++ b/ui/app/components/app/send/tests/send-container.test.js @@ -47,8 +47,8 @@ proxyquire('../send.container.js', { getTokenBalance: (s) => `mockTokenBalance:${s}`, getQrCodeData: (s) => `mockQrCodeData:${s}`, }, - '../../actions': actionSpies, - '../../ducks/send.duck': duckActionSpies, + '../../../store/actions': actionSpies, + '../../../ducks/send/send.duck': duckActionSpies, './send.utils.js': { calcGasTotal: (gasLimit, gasPrice) => gasLimit + gasPrice, }, diff --git a/ui/app/components/send/tests/send-selectors-test-data.js b/ui/app/components/app/send/tests/send-selectors-test-data.js similarity index 100% rename from ui/app/components/send/tests/send-selectors-test-data.js rename to ui/app/components/app/send/tests/send-selectors-test-data.js diff --git a/ui/app/components/send/tests/send-selectors.test.js b/ui/app/components/app/send/tests/send-selectors.test.js similarity index 100% rename from ui/app/components/send/tests/send-selectors.test.js rename to ui/app/components/app/send/tests/send-selectors.test.js diff --git a/ui/app/components/send/tests/send-utils.test.js b/ui/app/components/app/send/tests/send-utils.test.js similarity index 98% rename from ui/app/components/send/tests/send-utils.test.js rename to ui/app/components/app/send/tests/send-utils.test.js index 48fa09392567..fc4c6deed167 100644 --- a/ui/app/components/send/tests/send-utils.test.js +++ b/ui/app/components/app/send/tests/send-utils.test.js @@ -9,7 +9,7 @@ import { const { addCurrencies, subtractCurrencies, -} = require('../../../conversion-util') +} = require('../../../../helpers/utils/conversion-util') const { INSUFFICIENT_FUNDS_ERROR, @@ -32,7 +32,7 @@ const stubs = { } const sendUtils = proxyquire('../send.utils.js', { - '../../conversion-util': { + '../../../helpers/utils/conversion-util': { addCurrencies: stubs.addCurrencies, conversionUtil: stubs.conversionUtil, conversionGTE: stubs.conversionGTE, @@ -40,7 +40,7 @@ const sendUtils = proxyquire('../send.utils.js', { conversionGreaterThan: stubs.conversionGreaterThan, conversionLessThan: stubs.conversionLessThan, }, - '../../token-util': { calcTokenAmount: stubs.calcTokenAmount }, + '../../../helpers/utils/token-util': { calcTokenAmount: stubs.calcTokenAmount }, 'ethereumjs-abi': { rawEncode: stubs.rawEncode, }, diff --git a/ui/app/components/send/to-autocomplete.component.js b/ui/app/components/app/send/to-autocomplete.component.js similarity index 97% rename from ui/app/components/send/to-autocomplete.component.js rename to ui/app/components/app/send/to-autocomplete.component.js index 9e270db757eb..183967c58651 100644 --- a/ui/app/components/send/to-autocomplete.component.js +++ b/ui/app/components/app/send/to-autocomplete.component.js @@ -1,7 +1,7 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import AccountListItem from '../send/account-list-item/account-list-item.component' +import AccountListItem from './account-list-item/account-list-item.component' export default class ToAutoComplete extends Component { diff --git a/ui/app/components/send/to-autocomplete/index.js b/ui/app/components/app/send/to-autocomplete/index.js similarity index 100% rename from ui/app/components/send/to-autocomplete/index.js rename to ui/app/components/app/send/to-autocomplete/index.js diff --git a/ui/app/components/send/to-autocomplete/to-autocomplete.js b/ui/app/components/app/send/to-autocomplete/to-autocomplete.js similarity index 96% rename from ui/app/components/send/to-autocomplete/to-autocomplete.js rename to ui/app/components/app/send/to-autocomplete/to-autocomplete.js index 39d15dfa7c78..d3db8cb593f6 100644 --- a/ui/app/components/send/to-autocomplete/to-autocomplete.js +++ b/ui/app/components/app/send/to-autocomplete/to-autocomplete.js @@ -4,8 +4,8 @@ const h = require('react-hyperscript') const inherits = require('util').inherits const AccountListItem = require('../account-list-item/account-list-item.component').default const connect = require('react-redux').connect -const Tooltip = require('../../tooltip') -const checksumAddress = require('../../../util').checksumAddress +const Tooltip = require('../../../ui/tooltip') +const checksumAddress = require('../../../../helpers/utils/util').checksumAddress ToAutoComplete.contextTypes = { t: PropTypes.func, diff --git a/ui/app/components/shapeshift-form.js b/ui/app/components/app/shapeshift-form.js similarity index 98% rename from ui/app/components/shapeshift-form.js rename to ui/app/components/app/shapeshift-form.js index b22c01e8fce2..11459fd5ec3f 100644 --- a/ui/app/components/shapeshift-form.js +++ b/ui/app/components/app/shapeshift-form.js @@ -5,11 +5,11 @@ const Component = require('react').Component const connect = require('react-redux').connect const classnames = require('classnames') const qrcode = require('qrcode-generator') -const { shapeShiftSubview, pairUpdate, buyWithShapeShift } = require('../actions') -const { isValidAddress } = require('../util') +const { shapeShiftSubview, pairUpdate, buyWithShapeShift } = require('../../store/actions') +const { isValidAddress } = require('../../helpers/utils/util') const SimpleDropdown = require('./dropdowns/simple-dropdown') -import Button from './button' +import Button from '../ui/button' function mapStateToProps (state) { const { diff --git a/ui/app/components/shift-list-item.js b/ui/app/components/app/shift-list-item.js similarity index 95% rename from ui/app/components/shift-list-item.js rename to ui/app/components/app/shift-list-item.js index 2d08bbddcec6..f5fa00047bce 100644 --- a/ui/app/components/shift-list-item.js +++ b/ui/app/components/app/shift-list-item.js @@ -4,12 +4,12 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const connect = require('react-redux').connect const explorerLink = require('etherscan-link').createExplorerLink -const actions = require('../actions') -const { formatDate, addressSummary } = require('../util') +const actions = require('../../store/actions') +const { formatDate, addressSummary } = require('../../helpers/utils/util') -const CopyButton = require('./copyButton') -const EthBalance = require('./eth-balance') -const Tooltip = require('./tooltip') +const CopyButton = require('../ui/copyButton') +const EthBalance = require('../ui/eth-balance') +const Tooltip = require('../ui/tooltip') ShiftListItem.contextTypes = { diff --git a/ui/app/components/sidebars/index.js b/ui/app/components/app/sidebars/index.js similarity index 100% rename from ui/app/components/sidebars/index.js rename to ui/app/components/app/sidebars/index.js diff --git a/ui/app/components/sidebars/index.scss b/ui/app/components/app/sidebars/index.scss similarity index 98% rename from ui/app/components/sidebars/index.scss rename to ui/app/components/app/sidebars/index.scss index b9845d564fe4..08181426faa7 100644 --- a/ui/app/components/sidebars/index.scss +++ b/ui/app/components/app/sidebars/index.scss @@ -1,4 +1,4 @@ -@import './sidebar-content'; +@import 'sidebar-content'; .sidebar-right-enter { transition: transform 300ms ease-in-out; @@ -78,4 +78,4 @@ opacity: 1; visibility: visible; background-color: rgba(0, 0, 0, .3); -} \ No newline at end of file +} diff --git a/ui/app/components/sidebars/sidebar-content.scss b/ui/app/components/app/sidebars/sidebar-content.scss similarity index 100% rename from ui/app/components/sidebars/sidebar-content.scss rename to ui/app/components/app/sidebars/sidebar-content.scss diff --git a/ui/app/components/sidebars/sidebar.component.js b/ui/app/components/app/sidebars/sidebar.component.js similarity index 100% rename from ui/app/components/sidebars/sidebar.component.js rename to ui/app/components/app/sidebars/sidebar.component.js diff --git a/ui/app/components/sidebars/sidebar.constants.js b/ui/app/components/app/sidebars/sidebar.constants.js similarity index 100% rename from ui/app/components/sidebars/sidebar.constants.js rename to ui/app/components/app/sidebars/sidebar.constants.js diff --git a/ui/app/components/sidebars/tests/sidebars-component.test.js b/ui/app/components/app/sidebars/tests/sidebars-component.test.js similarity index 100% rename from ui/app/components/sidebars/tests/sidebars-component.test.js rename to ui/app/components/app/sidebars/tests/sidebars-component.test.js diff --git a/ui/app/components/signature-request.js b/ui/app/components/app/signature-request.js similarity index 83% rename from ui/app/components/signature-request.js rename to ui/app/components/app/signature-request.js index 25bd9a7b1b84..e47791b6784a 100644 --- a/ui/app/components/signature-request.js +++ b/ui/app/components/app/signature-request.js @@ -2,7 +2,9 @@ const Component = require('react').Component const PropTypes = require('prop-types') const h = require('react-hyperscript') const inherits = require('util').inherits -import Identicon from './identicon' +import { ENVIRONMENT_TYPE_NOTIFICATION } from '../../../../app/scripts/lib/enums' +import { getEnvironmentType } from '../../../../app/scripts/lib/util' +import Identicon from '../ui/identicon' const connect = require('react-redux').connect const ethUtil = require('ethereumjs-util') const classnames = require('classnames') @@ -10,10 +12,10 @@ const { compose } = require('recompose') const { withRouter } = require('react-router-dom') const { ObjectInspector } = require('react-inspector') -import AccountDropdownMini from './account-dropdown-mini' +import AccountDropdownMini from '../ui/account-dropdown-mini' -const actions = require('../actions') -const { conversionUtil } = require('../conversion-util') +const actions = require('../../store/actions') +const { conversionUtil } = require('../../helpers/utils/conversion-util') const { getSelectedAccount, @@ -21,12 +23,12 @@ const { getSelectedAddress, accountsWithSendEtherInfoSelector, conversionRateSelector, -} = require('../selectors.js') +} = require('../../selectors/selectors.js') -import { clearConfirmTransaction } from '../ducks/confirm-transaction.duck' -import Button from './button' +import { clearConfirmTransaction } from '../../ducks/confirm-transaction/confirm-transaction.duck' +import Button from '../ui/button' -const { DEFAULT_ROUTE } = require('../routes') +const { DEFAULT_ROUTE } = require('../../helpers/constants/routes') function mapStateToProps (state) { return { @@ -47,6 +49,42 @@ function mapDispatchToProps (dispatch) { } } +function mergeProps (stateProps, dispatchProps, ownProps) { + const { + signPersonalMessage, + signTypedMessage, + cancelPersonalMessage, + cancelTypedMessage, + signMessage, + cancelMessage, + txData, + } = ownProps + + const { type } = txData + + let cancel + let sign + if (type === 'personal_sign') { + cancel = cancelPersonalMessage + sign = signPersonalMessage + } else if (type === 'eth_signTypedData') { + cancel = cancelTypedMessage + sign = signTypedMessage + } else if (type === 'eth_sign') { + cancel = cancelMessage + sign = signMessage + } + + return { + ...stateProps, + ...dispatchProps, + ...ownProps, + txData, + cancel, + sign, + } +} + SignatureRequest.contextTypes = { t: PropTypes.func, metricsEvent: PropTypes.func, @@ -54,7 +92,7 @@ SignatureRequest.contextTypes = { module.exports = compose( withRouter, - connect(mapStateToProps, mapDispatchToProps) + connect(mapStateToProps, mapDispatchToProps, mergeProps) )(SignatureRequest) @@ -67,6 +105,24 @@ function SignatureRequest (props) { } } +SignatureRequest.prototype.componentDidMount = function () { + const { clearConfirmTransaction, cancel } = this.props + const { metricsEvent } = this.context + if (getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_NOTIFICATION) { + window.onbeforeunload = event => { + metricsEvent({ + eventOpts: { + category: 'Transactions', + action: 'Sign Request', + name: 'Cancel Sig Request Via Notification Close', + }, + }) + clearConfirmTransaction() + cancel(event) + } + } +} + SignatureRequest.prototype.renderHeader = function () { return h('div.request-signature__header', [ @@ -233,30 +289,7 @@ SignatureRequest.prototype.renderBody = function () { } SignatureRequest.prototype.renderFooter = function () { - const { - signPersonalMessage, - signTypedMessage, - cancelPersonalMessage, - cancelTypedMessage, - signMessage, - cancelMessage, - } = this.props - - const { txData } = this.props - const { type } = txData - - let cancel - let sign - if (type === 'personal_sign') { - cancel = cancelPersonalMessage - sign = signPersonalMessage - } else if (type === 'eth_signTypedData') { - cancel = cancelTypedMessage - sign = signTypedMessage - } else if (type === 'eth_sign') { - cancel = cancelMessage - sign = signMessage - } + const { cancel, sign } = this.props return h('div.request-signature__footer', [ h(Button, { diff --git a/ui/app/components/app/tab-bar.js b/ui/app/components/app/tab-bar.js new file mode 100644 index 000000000000..43923989acf8 --- /dev/null +++ b/ui/app/components/app/tab-bar.js @@ -0,0 +1,37 @@ +import React, { Component } from 'react' +const PropTypes = require('prop-types') +const classnames = require('classnames') + +class TabBar extends Component { + render () { + const { tabs = [], onSelect, isActive } = this.props + + return ( +
+ {tabs.map(({ key, content, description }) => ( +
onSelect(key)} + > +
+
{content}
+
{description}
+
+
+
+ ))} +
+ ) + } +} + +TabBar.propTypes = { + isActive: PropTypes.func.isRequired, + tabs: PropTypes.array, + onSelect: PropTypes.func, +} + +module.exports = TabBar diff --git a/ui/app/components/token-cell.js b/ui/app/components/app/token-cell.js similarity index 93% rename from ui/app/components/token-cell.js rename to ui/app/components/app/token-cell.js index d9c80b4f4c87..cef809e8a778 100644 --- a/ui/app/components/token-cell.js +++ b/ui/app/components/app/token-cell.js @@ -3,11 +3,11 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const inherits = require('util').inherits const connect = require('react-redux').connect -import Identicon from './identicon' -const prefixForNetwork = require('../../lib/etherscan-prefix-for-network') -const selectors = require('../selectors') -const actions = require('../actions') -const { conversionUtil, multiplyCurrencies } = require('../conversion-util') +import Identicon from '../ui/identicon' +const prefixForNetwork = require('../../../lib/etherscan-prefix-for-network') +const selectors = require('../../selectors/selectors') +const actions = require('../../store/actions') +const { conversionUtil, multiplyCurrencies } = require('../../helpers/utils/conversion-util') const TokenMenuDropdown = require('./dropdowns/token-menu-dropdown.js') diff --git a/ui/app/components/token-list.js b/ui/app/components/app/token-list.js similarity index 98% rename from ui/app/components/token-list.js rename to ui/app/components/app/token-list.js index 258abde72846..2188e7020b49 100644 --- a/ui/app/components/token-list.js +++ b/ui/app/components/app/token-list.js @@ -5,7 +5,7 @@ const inherits = require('util').inherits const TokenTracker = require('eth-token-tracker') const TokenCell = require('./token-cell.js') const connect = require('react-redux').connect -const selectors = require('../selectors') +const selectors = require('../../selectors/selectors') const log = require('loglevel') function mapStateToProps (state) { diff --git a/ui/app/components/transaction-action/index.js b/ui/app/components/app/transaction-action/index.js similarity index 100% rename from ui/app/components/transaction-action/index.js rename to ui/app/components/app/transaction-action/index.js diff --git a/ui/app/components/transaction-action/tests/transaction-action.component.test.js b/ui/app/components/app/transaction-action/tests/transaction-action.component.test.js similarity index 100% rename from ui/app/components/transaction-action/tests/transaction-action.component.test.js rename to ui/app/components/app/transaction-action/tests/transaction-action.component.test.js diff --git a/ui/app/components/transaction-action/transaction-action.component.js b/ui/app/components/app/transaction-action/transaction-action.component.js similarity index 89% rename from ui/app/components/transaction-action/transaction-action.component.js rename to ui/app/components/app/transaction-action/transaction-action.component.js index 1de91cb711d1..4a5efdaae4c5 100644 --- a/ui/app/components/transaction-action/transaction-action.component.js +++ b/ui/app/components/app/transaction-action/transaction-action.component.js @@ -1,8 +1,8 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import { getTransactionActionKey } from '../../helpers/transactions.util' -import { camelCaseToCapitalize } from '../../helpers/common.util' +import { getTransactionActionKey } from '../../../helpers/utils/transactions.util' +import { camelCaseToCapitalize } from '../../../helpers/utils/common.util' export default class TransactionAction extends PureComponent { static contextTypes = { diff --git a/ui/app/components/transaction-activity-log/index.js b/ui/app/components/app/transaction-activity-log/index.js similarity index 100% rename from ui/app/components/transaction-activity-log/index.js rename to ui/app/components/app/transaction-activity-log/index.js diff --git a/ui/app/components/transaction-activity-log/index.scss b/ui/app/components/app/transaction-activity-log/index.scss similarity index 100% rename from ui/app/components/transaction-activity-log/index.scss rename to ui/app/components/app/transaction-activity-log/index.scss diff --git a/ui/app/components/transaction-activity-log/tests/transaction-activity-log.component.test.js b/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.component.test.js similarity index 100% rename from ui/app/components/transaction-activity-log/tests/transaction-activity-log.component.test.js rename to ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.component.test.js diff --git a/ui/app/components/transaction-activity-log/tests/transaction-activity-log.container.test.js b/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.container.test.js similarity index 100% rename from ui/app/components/transaction-activity-log/tests/transaction-activity-log.container.test.js rename to ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.container.test.js diff --git a/ui/app/components/transaction-activity-log/tests/transaction-activity-log.util.test.js b/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.util.test.js similarity index 100% rename from ui/app/components/transaction-activity-log/tests/transaction-activity-log.util.test.js rename to ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.util.test.js diff --git a/ui/app/components/transaction-activity-log/transaction-activity-log-icon/index.js b/ui/app/components/app/transaction-activity-log/transaction-activity-log-icon/index.js similarity index 100% rename from ui/app/components/transaction-activity-log/transaction-activity-log-icon/index.js rename to ui/app/components/app/transaction-activity-log/transaction-activity-log-icon/index.js diff --git a/ui/app/components/transaction-activity-log/transaction-activity-log-icon/transaction-activity-log-icon.component.js b/ui/app/components/app/transaction-activity-log/transaction-activity-log-icon/transaction-activity-log-icon.component.js similarity index 100% rename from ui/app/components/transaction-activity-log/transaction-activity-log-icon/transaction-activity-log-icon.component.js rename to ui/app/components/app/transaction-activity-log/transaction-activity-log-icon/transaction-activity-log-icon.component.js diff --git a/ui/app/components/transaction-activity-log/transaction-activity-log.component.js b/ui/app/components/app/transaction-activity-log/transaction-activity-log.component.js similarity index 95% rename from ui/app/components/transaction-activity-log/transaction-activity-log.component.js rename to ui/app/components/app/transaction-activity-log/transaction-activity-log.component.js index ca46d7830c39..de4d297506a7 100644 --- a/ui/app/components/transaction-activity-log/transaction-activity-log.component.js +++ b/ui/app/components/app/transaction-activity-log/transaction-activity-log.component.js @@ -1,11 +1,11 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import { getEthConversionFromWeiHex, getValueFromWeiHex } from '../../helpers/conversions.util' -import { formatDate } from '../../util' +import { getEthConversionFromWeiHex, getValueFromWeiHex } from '../../../helpers/utils/conversions.util' +import { formatDate } from '../../../helpers/utils/util' import TransactionActivityLogIcon from './transaction-activity-log-icon' import { CONFIRMED_STATUS } from './transaction-activity-log.constants' -import prefixForNetwork from '../../../lib/etherscan-prefix-for-network' +import prefixForNetwork from '../../../../lib/etherscan-prefix-for-network' export default class TransactionActivityLog extends PureComponent { static contextTypes = { diff --git a/ui/app/components/transaction-activity-log/transaction-activity-log.constants.js b/ui/app/components/app/transaction-activity-log/transaction-activity-log.constants.js similarity index 100% rename from ui/app/components/transaction-activity-log/transaction-activity-log.constants.js rename to ui/app/components/app/transaction-activity-log/transaction-activity-log.constants.js diff --git a/ui/app/components/transaction-activity-log/transaction-activity-log.container.js b/ui/app/components/app/transaction-activity-log/transaction-activity-log.container.js similarity index 98% rename from ui/app/components/transaction-activity-log/transaction-activity-log.container.js rename to ui/app/components/app/transaction-activity-log/transaction-activity-log.container.js index e4322970805d..11b20f2457c8 100644 --- a/ui/app/components/transaction-activity-log/transaction-activity-log.container.js +++ b/ui/app/components/app/transaction-activity-log/transaction-activity-log.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import R from 'ramda' import TransactionActivityLog from './transaction-activity-log.component' -import { conversionRateSelector, getNativeCurrency } from '../../selectors' +import { conversionRateSelector, getNativeCurrency } from '../../../selectors/selectors' import { combineTransactionHistories } from './transaction-activity-log.util' import { TRANSACTION_RESUBMITTED_EVENT, diff --git a/ui/app/components/transaction-activity-log/transaction-activity-log.util.js b/ui/app/components/app/transaction-activity-log/transaction-activity-log.util.js similarity index 92% rename from ui/app/components/transaction-activity-log/transaction-activity-log.util.js rename to ui/app/components/app/transaction-activity-log/transaction-activity-log.util.js index 6206a4678741..b74513879ce5 100644 --- a/ui/app/components/transaction-activity-log/transaction-activity-log.util.js +++ b/ui/app/components/app/transaction-activity-log/transaction-activity-log.util.js @@ -1,4 +1,4 @@ -import { getHexGasTotal } from '../../helpers/confirm-transaction/util' +import { getHexGasTotal } from '../../../helpers/utils/confirm-tx.util' // path constants const STATUS_PATH = '/status' @@ -28,7 +28,7 @@ import { import { TRANSACTION_TYPE_CANCEL, TRANSACTION_TYPE_RETRY, -} from '../../../../app/scripts/controllers/transactions/enums' +} from '../../../../../app/scripts/controllers/transactions/enums' const eventPathsHash = { [STATUS_PATH]: true, @@ -51,7 +51,14 @@ const statusHash = { * @returns {Array} */ export function getActivities (transaction, isFirstTransaction = false) { - const { id, hash, history = [], txReceipt: { status } = {}, type } = transaction + const { + id, + hash, + history = [], + txParams: { gas: paramsGasLimit, gasPrice: paramsGasPrice}, + xReceipt: { status } = {}, + type, + } = transaction let cachedGasLimit = '0x0' let cachedGasPrice = '0x0' @@ -88,7 +95,9 @@ export function getActivities (transaction, isFirstTransaction = false) { if (path in eventPathsHash && op === REPLACE_OP) { switch (path) { case STATUS_PATH: { - const gasFee = getHexGasTotal({ gasLimit: cachedGasLimit, gasPrice: cachedGasPrice }) + const gasFee = cachedGasLimit === '0x0' && cachedGasPrice === '0x0' + ? getHexGasTotal({ gasLimit: paramsGasLimit, gasPrice: paramsGasPrice }) + : getHexGasTotal({ gasLimit: cachedGasLimit, gasPrice: cachedGasPrice }) if (value in statusHash) { let eventKey = statusHash[value] diff --git a/ui/app/components/transaction-breakdown/index.js b/ui/app/components/app/transaction-breakdown/index.js similarity index 100% rename from ui/app/components/transaction-breakdown/index.js rename to ui/app/components/app/transaction-breakdown/index.js diff --git a/ui/app/components/transaction-breakdown/index.scss b/ui/app/components/app/transaction-breakdown/index.scss similarity index 88% rename from ui/app/components/transaction-breakdown/index.scss rename to ui/app/components/app/transaction-breakdown/index.scss index b56cbdd7f722..c8144eac2094 100644 --- a/ui/app/components/transaction-breakdown/index.scss +++ b/ui/app/components/app/transaction-breakdown/index.scss @@ -1,4 +1,4 @@ -@import './transaction-breakdown-row/index'; +@import 'transaction-breakdown-row/index'; .transaction-breakdown { &__title { diff --git a/ui/app/components/transaction-breakdown/tests/transaction-breakdown.component.test.js b/ui/app/components/app/transaction-breakdown/tests/transaction-breakdown.component.test.js similarity index 100% rename from ui/app/components/transaction-breakdown/tests/transaction-breakdown.component.test.js rename to ui/app/components/app/transaction-breakdown/tests/transaction-breakdown.component.test.js diff --git a/ui/app/components/transaction-breakdown/transaction-breakdown-row/index.js b/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/index.js similarity index 100% rename from ui/app/components/transaction-breakdown/transaction-breakdown-row/index.js rename to ui/app/components/app/transaction-breakdown/transaction-breakdown-row/index.js diff --git a/ui/app/components/transaction-breakdown/transaction-breakdown-row/index.scss b/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/index.scss similarity index 100% rename from ui/app/components/transaction-breakdown/transaction-breakdown-row/index.scss rename to ui/app/components/app/transaction-breakdown/transaction-breakdown-row/index.scss diff --git a/ui/app/components/transaction-breakdown/transaction-breakdown-row/tests/transaction-breakdown-row.component.test.js b/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/tests/transaction-breakdown-row.component.test.js similarity index 96% rename from ui/app/components/transaction-breakdown/transaction-breakdown-row/tests/transaction-breakdown-row.component.test.js rename to ui/app/components/app/transaction-breakdown/transaction-breakdown-row/tests/transaction-breakdown-row.component.test.js index c19399dbb4df..82e40fce2d5f 100644 --- a/ui/app/components/transaction-breakdown/transaction-breakdown-row/tests/transaction-breakdown-row.component.test.js +++ b/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/tests/transaction-breakdown-row.component.test.js @@ -2,7 +2,7 @@ import React from 'react' import assert from 'assert' import { shallow } from 'enzyme' import TransactionBreakdownRow from '../transaction-breakdown-row.component' -import Button from '../../../button' +import Button from '../../../../ui/button' describe('TransactionBreakdownRow Component', () => { it('should render text properly', () => { diff --git a/ui/app/components/transaction-breakdown/transaction-breakdown-row/transaction-breakdown-row.component.js b/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/transaction-breakdown-row.component.js similarity index 100% rename from ui/app/components/transaction-breakdown/transaction-breakdown-row/transaction-breakdown-row.component.js rename to ui/app/components/app/transaction-breakdown/transaction-breakdown-row/transaction-breakdown-row.component.js diff --git a/ui/app/components/transaction-breakdown/transaction-breakdown.component.js b/ui/app/components/app/transaction-breakdown/transaction-breakdown.component.js similarity index 68% rename from ui/app/components/transaction-breakdown/transaction-breakdown.component.js rename to ui/app/components/app/transaction-breakdown/transaction-breakdown.component.js index 26f52317dadb..5642e0fa528e 100644 --- a/ui/app/components/transaction-breakdown/transaction-breakdown.component.js +++ b/ui/app/components/app/transaction-breakdown/transaction-breakdown.component.js @@ -2,12 +2,10 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' import TransactionBreakdownRow from './transaction-breakdown-row' -import CurrencyDisplay from '../currency-display' +import CurrencyDisplay from '../../ui/currency-display' import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display' -import HexToDecimal from '../hex-to-decimal' -import { GWEI, PRIMARY, SECONDARY } from '../../constants/common' -import { getHexGasTotal } from '../../helpers/confirm-transaction/util' -import { sumHexes } from '../../helpers/transactions.util' +import HexToDecimal from '../../ui/hex-to-decimal' +import { GWEI, PRIMARY, SECONDARY } from '../../../helpers/constants/common' export default class TransactionBreakdown extends PureComponent { static contextTypes = { @@ -19,6 +17,11 @@ export default class TransactionBreakdown extends PureComponent { className: PropTypes.string, nativeCurrency: PropTypes.string.isRequired, showFiat: PropTypes.bool, + gas: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + gasPrice: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + gasUsed: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + totalInHex: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), } static defaultProps = { @@ -28,13 +31,7 @@ export default class TransactionBreakdown extends PureComponent { render () { const { t } = this.context - const { transaction, className, nativeCurrency, showFiat } = this.props - const { txParams: { gas, gasPrice, value } = {}, txReceipt: { gasUsed } = {} } = transaction - - const gasLimit = typeof gasUsed === 'string' ? gasUsed : gas - - const hexGasTotal = getHexGasTotal({ gasLimit, gasPrice }) - const totalInHex = sumHexes(hexGasTotal, value) + const { gas, gasPrice, value, className, nativeCurrency, showFiat, totalInHex, gasUsed } = this.props return (
@@ -52,10 +49,13 @@ export default class TransactionBreakdown extends PureComponent { title={`${t('gasLimit')} (${t('units')})`} className="transaction-breakdown__row-title" > - + {typeof gas !== 'undefined' + ? + : '?' + } { typeof gasUsed === 'string' && ( @@ -71,13 +71,16 @@ export default class TransactionBreakdown extends PureComponent { ) } - + {typeof gasPrice !== 'undefined' + ? + : '?' + }
diff --git a/ui/app/components/app/transaction-breakdown/transaction-breakdown.container.js b/ui/app/components/app/transaction-breakdown/transaction-breakdown.container.js new file mode 100644 index 000000000000..82f3773589f8 --- /dev/null +++ b/ui/app/components/app/transaction-breakdown/transaction-breakdown.container.js @@ -0,0 +1,29 @@ +import { connect } from 'react-redux' +import TransactionBreakdown from './transaction-breakdown.component' +import {getIsMainnet, getNativeCurrency, preferencesSelector} from '../../../selectors/selectors' +import { getHexGasTotal } from '../../../helpers/utils/confirm-tx.util' +import { sumHexes } from '../../../helpers/utils/transactions.util' + +const mapStateToProps = (state, ownProps) => { + const { transaction } = ownProps + const { txParams: { gas, gasPrice, value } = {}, txReceipt: { gasUsed } = {} } = transaction + const { showFiatInTestnets } = preferencesSelector(state) + const isMainnet = getIsMainnet(state) + + const gasLimit = typeof gasUsed === 'string' ? gasUsed : gas + + const hexGasTotal = gasLimit && gasPrice && getHexGasTotal({ gasLimit, gasPrice }) || '0x0' + const totalInHex = sumHexes(hexGasTotal, value) + + return { + nativeCurrency: getNativeCurrency(state), + showFiat: (isMainnet || !!showFiatInTestnets), + totalInHex, + gas, + gasPrice, + value, + gasUsed, + } +} + +export default connect(mapStateToProps)(TransactionBreakdown) diff --git a/ui/app/components/transaction-list-item-details/index.js b/ui/app/components/app/transaction-list-item-details/index.js similarity index 100% rename from ui/app/components/transaction-list-item-details/index.js rename to ui/app/components/app/transaction-list-item-details/index.js diff --git a/ui/app/components/transaction-list-item-details/index.scss b/ui/app/components/app/transaction-list-item-details/index.scss similarity index 100% rename from ui/app/components/transaction-list-item-details/index.scss rename to ui/app/components/app/transaction-list-item-details/index.scss diff --git a/ui/app/components/transaction-list-item-details/tests/transaction-list-item-details.component.test.js b/ui/app/components/app/transaction-list-item-details/tests/transaction-list-item-details.component.test.js similarity index 95% rename from ui/app/components/transaction-list-item-details/tests/transaction-list-item-details.component.test.js rename to ui/app/components/app/transaction-list-item-details/tests/transaction-list-item-details.component.test.js index 5b55beeb49b9..c4e118b01354 100644 --- a/ui/app/components/transaction-list-item-details/tests/transaction-list-item-details.component.test.js +++ b/ui/app/components/app/transaction-list-item-details/tests/transaction-list-item-details.component.test.js @@ -2,8 +2,8 @@ import React from 'react' import assert from 'assert' import { shallow } from 'enzyme' import TransactionListItemDetails from '../transaction-list-item-details.component' -import Button from '../../button' -import SenderToRecipient from '../../sender-to-recipient' +import Button from '../../../ui/button' +import SenderToRecipient from '../../../ui/sender-to-recipient' import TransactionBreakdown from '../../transaction-breakdown' import TransactionActivityLog from '../../transaction-activity-log' diff --git a/ui/app/components/transaction-list-item-details/transaction-list-item-details.component.js b/ui/app/components/app/transaction-list-item-details/transaction-list-item-details.component.js similarity index 80% rename from ui/app/components/transaction-list-item-details/transaction-list-item-details.component.js rename to ui/app/components/app/transaction-list-item-details/transaction-list-item-details.component.js index 3e39212d3e96..4a3b04998e90 100644 --- a/ui/app/components/transaction-list-item-details/transaction-list-item-details.component.js +++ b/ui/app/components/app/transaction-list-item-details/transaction-list-item-details.component.js @@ -1,13 +1,13 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import copyToClipboard from 'copy-to-clipboard' -import SenderToRecipient from '../sender-to-recipient' -import { FLAT_VARIANT } from '../sender-to-recipient/sender-to-recipient.constants' +import SenderToRecipient from '../../ui/sender-to-recipient' +import { FLAT_VARIANT } from '../../ui/sender-to-recipient/sender-to-recipient.constants' import TransactionActivityLog from '../transaction-activity-log' import TransactionBreakdown from '../transaction-breakdown' -import Button from '../button' -import Tooltip from '../tooltip' -import prefixForNetwork from '../../../lib/etherscan-prefix-for-network' +import Button from '../../ui/button' +import Tooltip from '../../ui/tooltip' +import prefixForNetwork from '../../../../lib/etherscan-prefix-for-network' export default class TransactionListItemDetails extends PureComponent { static contextTypes = { @@ -20,11 +20,13 @@ export default class TransactionListItemDetails extends PureComponent { onRetry: PropTypes.func, showCancel: PropTypes.bool, showRetry: PropTypes.bool, + cancelDisabled: PropTypes.bool, transactionGroup: PropTypes.object, } state = { justCopied: false, + cancelDisabled: false, } handleEtherscanClick = () => { @@ -78,10 +80,52 @@ export default class TransactionListItemDetails extends PureComponent { }) } + renderCancel () { + const { t } = this.context + const { + showCancel, + cancelDisabled, + } = this.props + + if (!showCancel) { + return null + } + + return cancelDisabled + ? ( + +
+ +
+
+ ) + : ( + + ) + } + render () { const { t } = this.context const { justCopied } = this.state - const { transactionGroup, showCancel, showRetry, onCancel, onRetry } = this.props + const { + transactionGroup, + showRetry, + onCancel, + onRetry, + } = this.props const { primaryTransaction: transaction } = transactionGroup const { txParams: { to, from } = {} } = transaction @@ -101,17 +145,7 @@ export default class TransactionListItemDetails extends PureComponent { ) } - { - showCancel && ( - - ) - } + { this.renderCancel() }
) diff --git a/ui/app/components/transaction-list-item/transaction-list-item.container.js b/ui/app/components/app/transaction-list-item/transaction-list-item.container.js similarity index 66% rename from ui/app/components/transaction-list-item/transaction-list-item.container.js rename to ui/app/components/app/transaction-list-item/transaction-list-item.container.js index 93a82849eebc..de8a3bbba741 100644 --- a/ui/app/components/transaction-list-item/transaction-list-item.container.js +++ b/ui/app/components/app/transaction-list-item/transaction-list-item.container.js @@ -1,29 +1,45 @@ import { connect } from 'react-redux' import { withRouter } from 'react-router-dom' import { compose } from 'recompose' -import withMethodData from '../../higher-order-components/with-method-data' +import withMethodData from '../../../helpers/higher-order-components/with-method-data' import TransactionListItem from './transaction-list-item.component' -import { setSelectedToken, showModal, showSidebar, addKnownMethodData } from '../../actions' -import { hexToDecimal } from '../../helpers/conversions.util' -import { getTokenData } from '../../helpers/transactions.util' -import { increaseLastGasPrice } from '../../helpers/confirm-transaction/util' -import { formatDate } from '../../util' +import { setSelectedToken, showModal, showSidebar, addKnownMethodData } from '../../../store/actions' +import { hexToDecimal } from '../../../helpers/utils/conversions.util' +import { getTokenData } from '../../../helpers/utils/transactions.util' +import { getHexGasTotal, increaseLastGasPrice } from '../../../helpers/utils/confirm-tx.util' +import { formatDate } from '../../../helpers/utils/util' import { fetchBasicGasAndTimeEstimates, fetchGasEstimates, setCustomGasPriceForRetry, setCustomGasLimit, -} from '../../ducks/gas.duck' -import {getIsMainnet, preferencesSelector} from '../../selectors' +} from '../../../ducks/gas/gas.duck' +import { getIsMainnet, preferencesSelector, getSelectedAddress, conversionRateSelector } from '../../../selectors/selectors' +import { isBalanceSufficient } from '../send/send.utils' -const mapStateToProps = state => { - const { metamask: { knownMethodData } } = state +const mapStateToProps = (state, ownProps) => { + const { metamask: { knownMethodData, accounts } } = state const { showFiatInTestnets } = preferencesSelector(state) const isMainnet = getIsMainnet(state) + const { transactionGroup: { primaryTransaction } = {} } = ownProps + const { txParams: { gas: gasLimit, gasPrice } = {} } = primaryTransaction + const selectedAccountBalance = accounts[getSelectedAddress(state)].balance + + const hasEnoughCancelGas = primaryTransaction.txParams && isBalanceSufficient({ + amount: '0x0', + gasTotal: getHexGasTotal({ + gasPrice: increaseLastGasPrice(gasPrice), + gasLimit, + }), + balance: selectedAccountBalance, + conversionRate: conversionRateSelector(state), + }) return { knownMethodData, showFiat: (isMainnet || !!showFiatInTestnets), + selectedAccountBalance, + hasEnoughCancelGas, } } diff --git a/ui/app/components/transaction-list/index.js b/ui/app/components/app/transaction-list/index.js similarity index 100% rename from ui/app/components/transaction-list/index.js rename to ui/app/components/app/transaction-list/index.js diff --git a/ui/app/components/transaction-list/index.scss b/ui/app/components/app/transaction-list/index.scss similarity index 95% rename from ui/app/components/transaction-list/index.scss rename to ui/app/components/app/transaction-list/index.scss index ba7ffd87b0a6..a486f4112053 100644 --- a/ui/app/components/transaction-list/index.scss +++ b/ui/app/components/app/transaction-list/index.scss @@ -33,7 +33,7 @@ &__empty { flex: 1; display: grid; - grid-template-rows: 35% 1fr; + grid-template-rows: auto; padding-top: 8px; } diff --git a/ui/app/components/transaction-list/transaction-list.component.js b/ui/app/components/app/transaction-list/transaction-list.component.js similarity index 97% rename from ui/app/components/transaction-list/transaction-list.component.js rename to ui/app/components/app/transaction-list/transaction-list.component.js index ddab3b2903da..fc5488884004 100644 --- a/ui/app/components/transaction-list/transaction-list.component.js +++ b/ui/app/components/app/transaction-list/transaction-list.component.js @@ -2,7 +2,7 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import TransactionListItem from '../transaction-list-item' import ShapeShiftTransactionListItem from '../shift-list-item' -import { TRANSACTION_TYPE_SHAPESHIFT } from '../../constants/transactions' +import { TRANSACTION_TYPE_SHAPESHIFT } from '../../../helpers/constants/transactions' export default class TransactionList extends PureComponent { static contextTypes = { diff --git a/ui/app/components/transaction-list/transaction-list.container.js b/ui/app/components/app/transaction-list/transaction-list.container.js similarity index 82% rename from ui/app/components/transaction-list/transaction-list.container.js rename to ui/app/components/app/transaction-list/transaction-list.container.js index e70ca15c5eba..67a24588b6ac 100644 --- a/ui/app/components/transaction-list/transaction-list.container.js +++ b/ui/app/components/app/transaction-list/transaction-list.container.js @@ -5,10 +5,10 @@ import TransactionList from './transaction-list.component' import { nonceSortedCompletedTransactionsSelector, nonceSortedPendingTransactionsSelector, -} from '../../selectors/transactions' -import { getSelectedAddress, getAssetImages } from '../../selectors' -import { selectedTokenSelector } from '../../selectors/tokens' -import { updateNetworkNonce } from '../../actions' +} from '../../../selectors/transactions' +import { getSelectedAddress, getAssetImages } from '../../../selectors/selectors' +import { selectedTokenSelector } from '../../../selectors/tokens' +import { updateNetworkNonce } from '../../../store/actions' const mapStateToProps = state => { return { diff --git a/ui/app/components/transaction-status/index.js b/ui/app/components/app/transaction-status/index.js similarity index 100% rename from ui/app/components/transaction-status/index.js rename to ui/app/components/app/transaction-status/index.js diff --git a/ui/app/components/transaction-status/index.scss b/ui/app/components/app/transaction-status/index.scss similarity index 100% rename from ui/app/components/transaction-status/index.scss rename to ui/app/components/app/transaction-status/index.scss diff --git a/ui/app/components/transaction-status/tests/transaction-status.component.test.js b/ui/app/components/app/transaction-status/tests/transaction-status.component.test.js similarity index 94% rename from ui/app/components/transaction-status/tests/transaction-status.component.test.js rename to ui/app/components/app/transaction-status/tests/transaction-status.component.test.js index f4ddc92061b4..ec1d580bddea 100644 --- a/ui/app/components/transaction-status/tests/transaction-status.component.test.js +++ b/ui/app/components/app/transaction-status/tests/transaction-status.component.test.js @@ -2,7 +2,7 @@ import React from 'react' import assert from 'assert' import { mount } from 'enzyme' import TransactionStatus from '../transaction-status.component' -import Tooltip from '../../tooltip-v2' +import Tooltip from '../../../ui/tooltip-v2' describe('TransactionStatus Component', () => { it('should render APPROVED properly', () => { diff --git a/ui/app/components/transaction-status/transaction-status.component.js b/ui/app/components/app/transaction-status/transaction-status.component.js similarity index 94% rename from ui/app/components/transaction-status/transaction-status.component.js rename to ui/app/components/app/transaction-status/transaction-status.component.js index 28544d2cdaf0..d3a2395399cf 100644 --- a/ui/app/components/transaction-status/transaction-status.component.js +++ b/ui/app/components/app/transaction-status/transaction-status.component.js @@ -1,7 +1,7 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import Tooltip from '../tooltip-v2' +import Tooltip from '../../ui/tooltip-v2' import { UNAPPROVED_STATUS, REJECTED_STATUS, @@ -12,7 +12,7 @@ import { FAILED_STATUS, DROPPED_STATUS, CANCELLED_STATUS, -} from '../../constants/transactions' +} from '../../../helpers/constants/transactions' const statusToClassNameHash = { [UNAPPROVED_STATUS]: 'transaction-status--unapproved', diff --git a/ui/app/components/transaction-view-balance/index.js b/ui/app/components/app/transaction-view-balance/index.js similarity index 100% rename from ui/app/components/transaction-view-balance/index.js rename to ui/app/components/app/transaction-view-balance/index.js diff --git a/ui/app/components/transaction-view-balance/index.scss b/ui/app/components/app/transaction-view-balance/index.scss similarity index 100% rename from ui/app/components/transaction-view-balance/index.scss rename to ui/app/components/app/transaction-view-balance/index.scss diff --git a/ui/app/components/transaction-view-balance/tests/token-view-balance.component.test.js b/ui/app/components/app/transaction-view-balance/tests/token-view-balance.component.test.js similarity index 95% rename from ui/app/components/transaction-view-balance/tests/token-view-balance.component.test.js rename to ui/app/components/app/transaction-view-balance/tests/token-view-balance.component.test.js index efc987371b0a..0e2882e9c0e2 100644 --- a/ui/app/components/transaction-view-balance/tests/token-view-balance.component.test.js +++ b/ui/app/components/app/transaction-view-balance/tests/token-view-balance.component.test.js @@ -2,9 +2,9 @@ import React from 'react' import assert from 'assert' import { shallow } from 'enzyme' import sinon from 'sinon' -import TokenBalance from '../../token-balance' +import TokenBalance from '../../../ui/token-balance' import UserPreferencedCurrencyDisplay from '../../user-preferenced-currency-display' -import { SEND_ROUTE } from '../../../routes' +import { SEND_ROUTE } from '../../../../helpers/constants/routes' import TransactionViewBalance from '../transaction-view-balance.component' const propsMethodSpies = { diff --git a/ui/app/components/transaction-view-balance/transaction-view-balance.component.js b/ui/app/components/app/transaction-view-balance/transaction-view-balance.component.js similarity index 93% rename from ui/app/components/transaction-view-balance/transaction-view-balance.component.js rename to ui/app/components/app/transaction-view-balance/transaction-view-balance.component.js index a18e959b5a00..8559e223358a 100644 --- a/ui/app/components/transaction-view-balance/transaction-view-balance.component.js +++ b/ui/app/components/app/transaction-view-balance/transaction-view-balance.component.js @@ -1,13 +1,13 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import Button from '../button' -import Identicon from '../identicon' -import TokenBalance from '../token-balance' +import Button from '../../ui/button' +import Identicon from '../../ui/identicon' +import TokenBalance from '../../ui/token-balance' import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display' -import { SEND_ROUTE } from '../../routes' -import { PRIMARY, SECONDARY } from '../../constants/common' -import Tooltip from '../tooltip-v2' +import { SEND_ROUTE } from '../../../helpers/constants/routes' +import { PRIMARY, SECONDARY } from '../../../helpers/constants/common' +import Tooltip from '../../ui/tooltip-v2' export default class TransactionViewBalance extends PureComponent { static contextTypes = { diff --git a/ui/app/components/transaction-view-balance/transaction-view-balance.container.js b/ui/app/components/app/transaction-view-balance/transaction-view-balance.container.js similarity index 93% rename from ui/app/components/transaction-view-balance/transaction-view-balance.container.js rename to ui/app/components/app/transaction-view-balance/transaction-view-balance.container.js index df6d287eb2a8..41a4525dca41 100644 --- a/ui/app/components/transaction-view-balance/transaction-view-balance.container.js +++ b/ui/app/components/app/transaction-view-balance/transaction-view-balance.container.js @@ -11,8 +11,8 @@ import { isBalanceCached, preferencesSelector, getIsMainnet, -} from '../../selectors' -import { showModal } from '../../actions' +} from '../../../selectors/selectors' +import { showModal } from '../../../store/actions' const mapStateToProps = state => { const { showFiatInTestnets } = preferencesSelector(state) diff --git a/ui/app/components/transaction-view/index.js b/ui/app/components/app/transaction-view/index.js similarity index 100% rename from ui/app/components/transaction-view/index.js rename to ui/app/components/app/transaction-view/index.js diff --git a/ui/app/components/transaction-view/index.scss b/ui/app/components/app/transaction-view/index.scss similarity index 100% rename from ui/app/components/transaction-view/index.scss rename to ui/app/components/app/transaction-view/index.scss diff --git a/ui/app/components/transaction-view/transaction-view.component.js b/ui/app/components/app/transaction-view/transaction-view.component.js similarity index 100% rename from ui/app/components/transaction-view/transaction-view.component.js rename to ui/app/components/app/transaction-view/transaction-view.component.js diff --git a/ui/app/components/ui-migration-annoucement/index.js b/ui/app/components/app/ui-migration-annoucement/index.js similarity index 100% rename from ui/app/components/ui-migration-annoucement/index.js rename to ui/app/components/app/ui-migration-annoucement/index.js diff --git a/ui/app/components/ui-migration-annoucement/index.scss b/ui/app/components/app/ui-migration-annoucement/index.scss similarity index 100% rename from ui/app/components/ui-migration-annoucement/index.scss rename to ui/app/components/app/ui-migration-annoucement/index.scss diff --git a/ui/app/components/ui-migration-annoucement/ui-migration-annoucement.component.js b/ui/app/components/app/ui-migration-annoucement/ui-migration-annoucement.component.js similarity index 100% rename from ui/app/components/ui-migration-annoucement/ui-migration-annoucement.component.js rename to ui/app/components/app/ui-migration-annoucement/ui-migration-annoucement.component.js diff --git a/ui/app/components/ui-migration-annoucement/ui-migration-announcement.container.js b/ui/app/components/app/ui-migration-annoucement/ui-migration-announcement.container.js similarity index 88% rename from ui/app/components/ui-migration-annoucement/ui-migration-announcement.container.js rename to ui/app/components/app/ui-migration-annoucement/ui-migration-announcement.container.js index 6dc993b8730d..55efd5a44bf5 100644 --- a/ui/app/components/ui-migration-annoucement/ui-migration-announcement.container.js +++ b/ui/app/components/app/ui-migration-annoucement/ui-migration-announcement.container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import UiMigrationAnnouncement from './ui-migration-annoucement.component' -import { setCompletedUiMigration } from '../../actions' +import { setCompletedUiMigration } from '../../../store/actions' const mapStateToProps = (state) => { const shouldShowAnnouncement = !state.metamask.completedUiMigration diff --git a/ui/app/components/user-preferenced-currency-display/index.js b/ui/app/components/app/user-preferenced-currency-display/index.js similarity index 100% rename from ui/app/components/user-preferenced-currency-display/index.js rename to ui/app/components/app/user-preferenced-currency-display/index.js diff --git a/ui/app/components/user-preferenced-currency-display/tests/user-preferenced-currency-display.component.test.js b/ui/app/components/app/user-preferenced-currency-display/tests/user-preferenced-currency-display.component.test.js similarity index 94% rename from ui/app/components/user-preferenced-currency-display/tests/user-preferenced-currency-display.component.test.js rename to ui/app/components/app/user-preferenced-currency-display/tests/user-preferenced-currency-display.component.test.js index ead584c267a5..51b2a3c4f43e 100644 --- a/ui/app/components/user-preferenced-currency-display/tests/user-preferenced-currency-display.component.test.js +++ b/ui/app/components/app/user-preferenced-currency-display/tests/user-preferenced-currency-display.component.test.js @@ -2,7 +2,7 @@ import React from 'react' import assert from 'assert' import { shallow } from 'enzyme' import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display.component' -import CurrencyDisplay from '../../currency-display' +import CurrencyDisplay from '../../../ui/currency-display' describe('UserPreferencedCurrencyDisplay Component', () => { describe('rendering', () => { diff --git a/ui/app/components/user-preferenced-currency-display/tests/user-preferenced-currency-display.container.test.js b/ui/app/components/app/user-preferenced-currency-display/tests/user-preferenced-currency-display.container.test.js similarity index 100% rename from ui/app/components/user-preferenced-currency-display/tests/user-preferenced-currency-display.container.test.js rename to ui/app/components/app/user-preferenced-currency-display/tests/user-preferenced-currency-display.container.test.js diff --git a/ui/app/components/user-preferenced-currency-display/user-preferenced-currency-display.component.js b/ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.component.js similarity index 91% rename from ui/app/components/user-preferenced-currency-display/user-preferenced-currency-display.component.js rename to ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.component.js index d9f29327da61..4b64b26c0221 100644 --- a/ui/app/components/user-preferenced-currency-display/user-preferenced-currency-display.component.js +++ b/ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.component.js @@ -1,7 +1,7 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import { PRIMARY, SECONDARY, ETH } from '../../constants/common' -import CurrencyDisplay from '../currency-display' +import { PRIMARY, SECONDARY, ETH } from '../../../helpers/constants/common' +import CurrencyDisplay from '../../ui/currency-display' export default class UserPreferencedCurrencyDisplay extends PureComponent { static propTypes = { diff --git a/ui/app/components/user-preferenced-currency-display/user-preferenced-currency-display.container.js b/ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.container.js similarity index 92% rename from ui/app/components/user-preferenced-currency-display/user-preferenced-currency-display.container.js rename to ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.container.js index 3c5bd0f21488..42d156f9286f 100644 --- a/ui/app/components/user-preferenced-currency-display/user-preferenced-currency-display.container.js +++ b/ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import UserPreferencedCurrencyDisplay from './user-preferenced-currency-display.component' -import { preferencesSelector, getIsMainnet } from '../../selectors' -import { ETH, PRIMARY, SECONDARY } from '../../constants/common' +import { preferencesSelector, getIsMainnet } from '../../../selectors/selectors' +import { ETH, PRIMARY, SECONDARY } from '../../../helpers/constants/common' const mapStateToProps = (state, ownProps) => { const { diff --git a/ui/app/components/user-preferenced-currency-input/index.js b/ui/app/components/app/user-preferenced-currency-input/index.js similarity index 100% rename from ui/app/components/user-preferenced-currency-input/index.js rename to ui/app/components/app/user-preferenced-currency-input/index.js diff --git a/ui/app/components/user-preferenced-currency-input/tests/user-preferenced-currency-input.component.test.js b/ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.component.test.js similarity index 94% rename from ui/app/components/user-preferenced-currency-input/tests/user-preferenced-currency-input.component.test.js rename to ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.component.test.js index 710b5d5196c4..3802e16f38d8 100644 --- a/ui/app/components/user-preferenced-currency-input/tests/user-preferenced-currency-input.component.test.js +++ b/ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.component.test.js @@ -2,7 +2,7 @@ import React from 'react' import assert from 'assert' import { shallow } from 'enzyme' import UserPreferencedCurrencyInput from '../user-preferenced-currency-input.component' -import CurrencyInput from '../../currency-input' +import CurrencyInput from '../../../ui/currency-input' describe('UserPreferencedCurrencyInput Component', () => { describe('rendering', () => { diff --git a/ui/app/components/user-preferenced-currency-input/tests/user-preferenced-currency-input.container.test.js b/ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.container.test.js similarity index 100% rename from ui/app/components/user-preferenced-currency-input/tests/user-preferenced-currency-input.container.test.js rename to ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.container.test.js diff --git a/ui/app/components/user-preferenced-currency-input/user-preferenced-currency-input.component.js b/ui/app/components/app/user-preferenced-currency-input/user-preferenced-currency-input.component.js similarity index 89% rename from ui/app/components/user-preferenced-currency-input/user-preferenced-currency-input.component.js rename to ui/app/components/app/user-preferenced-currency-input/user-preferenced-currency-input.component.js index 463e66b80753..7c0ec17341b9 100644 --- a/ui/app/components/user-preferenced-currency-input/user-preferenced-currency-input.component.js +++ b/ui/app/components/app/user-preferenced-currency-input/user-preferenced-currency-input.component.js @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import CurrencyInput from '../currency-input' +import CurrencyInput from '../../ui/currency-input' export default class UserPreferencedCurrencyInput extends PureComponent { static propTypes = { diff --git a/ui/app/components/user-preferenced-currency-input/user-preferenced-currency-input.container.js b/ui/app/components/app/user-preferenced-currency-input/user-preferenced-currency-input.container.js similarity index 84% rename from ui/app/components/user-preferenced-currency-input/user-preferenced-currency-input.container.js rename to ui/app/components/app/user-preferenced-currency-input/user-preferenced-currency-input.container.js index 0b88eb5a7523..72f17fde43bd 100644 --- a/ui/app/components/user-preferenced-currency-input/user-preferenced-currency-input.container.js +++ b/ui/app/components/app/user-preferenced-currency-input/user-preferenced-currency-input.container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import UserPreferencedCurrencyInput from './user-preferenced-currency-input.component' -import { preferencesSelector } from '../../selectors' +import { preferencesSelector } from '../../../selectors/selectors' const mapStateToProps = state => { const { useNativeCurrencyAsPrimaryCurrency } = preferencesSelector(state) diff --git a/ui/app/components/user-preferenced-token-input/index.js b/ui/app/components/app/user-preferenced-token-input/index.js similarity index 100% rename from ui/app/components/user-preferenced-token-input/index.js rename to ui/app/components/app/user-preferenced-token-input/index.js diff --git a/ui/app/components/user-preferenced-token-input/tests/user-preferenced-token-input.component.test.js b/ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.component.test.js similarity index 95% rename from ui/app/components/user-preferenced-token-input/tests/user-preferenced-token-input.component.test.js rename to ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.component.test.js index d85bddeebbc4..41cfd51f96c2 100644 --- a/ui/app/components/user-preferenced-token-input/tests/user-preferenced-token-input.component.test.js +++ b/ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.component.test.js @@ -2,7 +2,7 @@ import React from 'react' import assert from 'assert' import { shallow } from 'enzyme' import UserPreferencedTokenInput from '../user-preferenced-token-input.component' -import TokenInput from '../../token-input' +import TokenInput from '../../../ui/token-input' describe('UserPreferencedCurrencyInput Component', () => { describe('rendering', () => { diff --git a/ui/app/components/user-preferenced-token-input/tests/user-preferenced-token-input.container.test.js b/ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.container.test.js similarity index 100% rename from ui/app/components/user-preferenced-token-input/tests/user-preferenced-token-input.container.test.js rename to ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.container.test.js diff --git a/ui/app/components/user-preferenced-token-input/user-preferenced-token-input.component.js b/ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.component.js similarity index 90% rename from ui/app/components/user-preferenced-token-input/user-preferenced-token-input.component.js rename to ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.component.js index 8f14231ac8cc..24133188d4d7 100644 --- a/ui/app/components/user-preferenced-token-input/user-preferenced-token-input.component.js +++ b/ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.component.js @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import TokenInput from '../token-input' +import TokenInput from '../../ui/token-input' export default class UserPreferencedTokenInput extends PureComponent { static propTypes = { diff --git a/ui/app/components/user-preferenced-token-input/user-preferenced-token-input.container.js b/ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.container.js similarity index 84% rename from ui/app/components/user-preferenced-token-input/user-preferenced-token-input.container.js rename to ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.container.js index 3305d4e29579..4a20b20d960d 100644 --- a/ui/app/components/user-preferenced-token-input/user-preferenced-token-input.container.js +++ b/ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import UserPreferencedTokenInput from './user-preferenced-token-input.component' -import { preferencesSelector } from '../../selectors' +import { preferencesSelector } from '../../../selectors/selectors' const mapStateToProps = state => { const { useNativeCurrencyAsPrimaryCurrency } = preferencesSelector(state) diff --git a/ui/app/components/wallet-view.js b/ui/app/components/app/wallet-view.js similarity index 93% rename from ui/app/components/wallet-view.js rename to ui/app/components/app/wallet-view.js index 65a532af6d76..cec8228b11e7 100644 --- a/ui/app/components/wallet-view.js +++ b/ui/app/components/app/wallet-view.js @@ -6,16 +6,16 @@ const { withRouter } = require('react-router-dom') const { compose } = require('recompose') const inherits = require('util').inherits const classnames = require('classnames') -const { checksumAddress } = require('../util') -import Identicon from './identicon' +const { checksumAddress } = require('../../helpers/utils/util') +import Identicon from '../ui/identicon' // const AccountDropdowns = require('./dropdowns/index.js').AccountDropdowns -const Tooltip = require('./tooltip-v2.js').default +const Tooltip = require('../ui/tooltip-v2.js').default const copyToClipboard = require('copy-to-clipboard') -const actions = require('../actions') -import BalanceComponent from './balance' +const actions = require('../../store/actions') +import BalanceComponent from '../ui/balance' const TokenList = require('./token-list') -const selectors = require('../selectors') -const { ADD_TOKEN_ROUTE } = require('../routes') +const selectors = require('../../selectors/selectors') +const { ADD_TOKEN_ROUTE } = require('../../helpers/constants/routes') import AddTokenButton from './add-token-button' @@ -106,11 +106,12 @@ WalletView.prototype.renderAddToken = function () { hideSidebar, history, } = this.props + const { metricsEvent } = this.context return h(AddTokenButton, { onClick () { history.push(ADD_TOKEN_ROUTE) - this.context.metricsEvent({ + metricsEvent({ eventOpts: { category: 'Navigation', action: 'Token Menu', diff --git a/ui/app/components/confirm-page-container/index.scss b/ui/app/components/confirm-page-container/index.scss deleted file mode 100644 index d41cd4423cdf..000000000000 --- a/ui/app/components/confirm-page-container/index.scss +++ /dev/null @@ -1,7 +0,0 @@ -@import './confirm-page-container-content/index'; - -@import './confirm-page-container-header/index'; - -@import './confirm-detail-row/index'; - -@import './confirm-page-container-navigation/index'; \ No newline at end of file diff --git a/ui/app/components/index.scss b/ui/app/components/index.scss deleted file mode 100644 index 96cc74c79aba..000000000000 --- a/ui/app/components/index.scss +++ /dev/null @@ -1,81 +0,0 @@ -@import './account-menu/index'; - -@import './add-token-button/index'; - -@import './app-header/index'; - -@import './breadcrumbs/index'; - -@import './button-group/index'; - -@import './card/index'; - -@import './confirm-page-container/index'; - -@import './currency-input/index'; - -@import './currency-display/index'; - -@import './error-message/index'; - -@import './export-text-container/index'; - -@import './identicon/index'; - -@import './info-box/index'; - -@import './menu-bar/index'; - -@import './modal/index'; - -@import './modals/index'; - -@import './network-display/index'; - -@import './page-container/index'; - -@import './pages/index'; - -@import './provider-page-container/index'; - -@import './selected-account/index'; - -@import './sender-to-recipient/index'; - -@import './tabs/index'; - -@import './token-balance/index'; - -@import './transaction-activity-log/index'; - -@import './transaction-breakdown/index'; - -@import './transaction-view/index'; - -@import './transaction-view-balance/index'; - -@import './transaction-list/index'; - -@import './transaction-list-item/index'; - -@import './transaction-list-item-details/index'; - -@import './transaction-status/index'; - -@import './app-header/index'; - -@import './sidebars/index'; - -@import './unit-input/index'; - -@import './gas-customization/gas-modal-page-container/index'; - -@import './gas-customization/gas-modal-page-container/index'; - -@import './gas-customization/gas-modal-page-container/index'; - -@import './gas-customization/index'; - -@import './gas-customization/gas-price-button-group/index'; - -@import './ui-migration-annoucement/index'; diff --git a/ui/app/components/modals/index.scss b/ui/app/components/modals/index.scss deleted file mode 100644 index 555da87ef09e..000000000000 --- a/ui/app/components/modals/index.scss +++ /dev/null @@ -1,11 +0,0 @@ -@import './cancel-transaction/index'; - -@import './confirm-remove-account/index'; - -@import './customize-gas/index'; - -@import './qr-scanner/index'; - -@import './transaction-confirmed/index'; - -@import './metametrics-opt-in-modal/index'; diff --git a/ui/app/components/pages/index.scss b/ui/app/components/pages/index.scss deleted file mode 100644 index 6a0680f32bae..000000000000 --- a/ui/app/components/pages/index.scss +++ /dev/null @@ -1,11 +0,0 @@ -@import './unlock-page/index'; - -@import './add-token/index'; - -@import './confirm-add-token/index'; - -@import './settings/index'; - -@import './first-time-flow/index'; - -@import './keychains/index'; diff --git a/ui/app/components/pages/settings/index.scss b/ui/app/components/pages/settings/index.scss deleted file mode 100644 index 138ebcfc5cb7..000000000000 --- a/ui/app/components/pages/settings/index.scss +++ /dev/null @@ -1,80 +0,0 @@ -@import './info-tab/index'; - -@import './settings-tab/index'; - -.settings-page { - position: relative; - background: $white; - display: flex; - flex-flow: column nowrap; - - &__header { - padding: 25px 25px 0; - } - - &__close-button::after { - content: '\00D7'; - font-size: 40px; - color: $dusty-gray; - position: absolute; - top: 25px; - right: 30px; - cursor: pointer; - } - - &__content { - padding: 25px; - height: auto; - overflow: auto; - } - - &__content-row { - display: flex; - flex-direction: row; - padding: 10px 0 20px; - - @media screen and (max-width: 575px) { - flex-direction: column; - padding: 10px 0; - } - } - - &__content-item { - flex: 1; - min-width: 0; - display: flex; - flex-direction: column; - padding: 0 5px; - min-height: 71px; - - @media screen and (max-width: 575px) { - height: initial; - padding: 5px 0; - } - - &--without-height { - height: initial; - } - } - - &__content-label { - text-transform: capitalize; - } - - &__content-description { - font-size: 14px; - color: $dusty-gray; - padding-top: 5px; - } - - &__content-item-col { - max-width: 300px; - display: flex; - flex-direction: column; - - @media screen and (max-width: 575px) { - max-width: 100%; - width: 100%; - } - } -} diff --git a/ui/app/components/pages/settings/settings-tab/settings-tab.container.js b/ui/app/components/pages/settings/settings-tab/settings-tab.container.js deleted file mode 100644 index 64c256412d74..000000000000 --- a/ui/app/components/pages/settings/settings-tab/settings-tab.container.js +++ /dev/null @@ -1,83 +0,0 @@ -import SettingsTab from './settings-tab.component' -import { compose } from 'recompose' -import { connect } from 'react-redux' -import { withRouter } from 'react-router-dom' -import { - setCurrentCurrency, - updateAndSetCustomRpc, - displayWarning, - revealSeedConfirmation, - setUseBlockie, - updateCurrentLocale, - setFeatureFlag, - showModal, - setUseNativeCurrencyAsPrimaryCurrencyPreference, - setShowFiatConversionOnTestnetsPreference, - setParticipateInMetaMetrics, -} from '../../../../actions' -import { preferencesSelector } from '../../../../selectors' - -const mapStateToProps = state => { - const { appState: { warning }, metamask } = state - const { - currentCurrency, - conversionDate, - nativeCurrency, - useBlockie, - featureFlags: { - sendHexData, - privacyMode, - advancedInlineGas, - mobileSync, - } = {}, - provider = {}, - currentLocale, - participateInMetaMetrics, - } = metamask - const { useNativeCurrencyAsPrimaryCurrency, showFiatInTestnets } = preferencesSelector(state) - - return { - warning, - currentLocale, - currentCurrency, - conversionDate, - nativeCurrency, - useBlockie, - sendHexData, - advancedInlineGas, - privacyMode, - provider, - useNativeCurrencyAsPrimaryCurrency, - mobileSync, - showFiatInTestnets, - participateInMetaMetrics, - } -} - -const mapDispatchToProps = dispatch => { - return { - setCurrentCurrency: currency => dispatch(setCurrentCurrency(currency)), - setRpcTarget: (newRpc, chainId, ticker, nickname) => dispatch(updateAndSetCustomRpc(newRpc, chainId, ticker, nickname)), - displayWarning: warning => dispatch(displayWarning(warning)), - revealSeedConfirmation: () => dispatch(revealSeedConfirmation()), - setUseBlockie: value => dispatch(setUseBlockie(value)), - updateCurrentLocale: key => dispatch(updateCurrentLocale(key)), - setHexDataFeatureFlag: shouldShow => dispatch(setFeatureFlag('sendHexData', shouldShow)), - setAdvancedInlineGasFeatureFlag: shouldShow => dispatch(setFeatureFlag('advancedInlineGas', shouldShow)), - setPrivacyMode: enabled => dispatch(setFeatureFlag('privacyMode', enabled)), - showResetAccountConfirmationModal: () => dispatch(showModal({ name: 'CONFIRM_RESET_ACCOUNT' })), - setUseNativeCurrencyAsPrimaryCurrencyPreference: value => { - return dispatch(setUseNativeCurrencyAsPrimaryCurrencyPreference(value)) - }, - setShowFiatConversionOnTestnetsPreference: value => { - return dispatch(setShowFiatConversionOnTestnetsPreference(value)) - }, - showClearApprovalModal: () => dispatch(showModal({ name: 'CLEAR_APPROVED_ORIGINS' })), - setParticipateInMetaMetrics: (val) => dispatch(setParticipateInMetaMetrics(val)), - } -} - -export default compose( - withRouter, - connect(mapStateToProps, mapDispatchToProps) -)(SettingsTab) diff --git a/ui/app/components/pages/settings/settings.component.js b/ui/app/components/pages/settings/settings.component.js deleted file mode 100644 index 94a97bba11cf..000000000000 --- a/ui/app/components/pages/settings/settings.component.js +++ /dev/null @@ -1,54 +0,0 @@ -import React, { PureComponent } from 'react' -import PropTypes from 'prop-types' -import { Switch, Route, matchPath } from 'react-router-dom' -import TabBar from '../../tab-bar' -import SettingsTab from './settings-tab' -import InfoTab from './info-tab' -import { DEFAULT_ROUTE, SETTINGS_ROUTE, INFO_ROUTE } from '../../../routes' - -export default class SettingsPage extends PureComponent { - static propTypes = { - location: PropTypes.object, - history: PropTypes.object, - t: PropTypes.func, - } - - static contextTypes = { - t: PropTypes.func, - } - - render () { - const { history, location } = this.props - - return ( -
-
-
history.push(DEFAULT_ROUTE)} - /> - matchPath(location.pathname, { path: key, exact: true })} - onSelect={key => history.push(key)} - /> -
- - - - -
- ) - } -} diff --git a/ui/app/components/tab-bar.js b/ui/app/components/tab-bar.js deleted file mode 100644 index 0016a09c168c..000000000000 --- a/ui/app/components/tab-bar.js +++ /dev/null @@ -1,33 +0,0 @@ -const { Component } = require('react') -const h = require('react-hyperscript') -const PropTypes = require('prop-types') -const classnames = require('classnames') - -class TabBar extends Component { - render () { - const { tabs = [], onSelect, isActive } = this.props - - return ( - h('.tab-bar', {}, [ - tabs.map(({ key, content }) => { - return h('div', { - className: classnames('tab-bar__tab pointer', { - 'tab-bar__tab--active': isActive(key, content), - }), - onClick: () => onSelect(key), - key, - }, content) - }), - h('div.tab-bar__tab.tab-bar__grow-tab'), - ]) - ) - } -} - -TabBar.propTypes = { - isActive: PropTypes.func.isRequired, - tabs: PropTypes.array, - onSelect: PropTypes.func, -} - -module.exports = TabBar diff --git a/ui/app/components/transaction-breakdown/transaction-breakdown.container.js b/ui/app/components/transaction-breakdown/transaction-breakdown.container.js deleted file mode 100644 index 919187b6f29c..000000000000 --- a/ui/app/components/transaction-breakdown/transaction-breakdown.container.js +++ /dev/null @@ -1,15 +0,0 @@ -import { connect } from 'react-redux' -import TransactionBreakdown from './transaction-breakdown.component' -import {getIsMainnet, getNativeCurrency, preferencesSelector} from '../../selectors' - -const mapStateToProps = (state) => { - const { showFiatInTestnets } = preferencesSelector(state) - const isMainnet = getIsMainnet(state) - - return { - nativeCurrency: getNativeCurrency(state), - showFiat: (isMainnet || !!showFiatInTestnets), - } -} - -export default connect(mapStateToProps)(TransactionBreakdown) diff --git a/ui/app/components/account-dropdown-mini/account-dropdown-mini.component.js b/ui/app/components/ui/account-dropdown-mini/account-dropdown-mini.component.js similarity index 96% rename from ui/app/components/account-dropdown-mini/account-dropdown-mini.component.js rename to ui/app/components/ui/account-dropdown-mini/account-dropdown-mini.component.js index 8a171d0c66f3..8abe1ab18118 100644 --- a/ui/app/components/account-dropdown-mini/account-dropdown-mini.component.js +++ b/ui/app/components/ui/account-dropdown-mini/account-dropdown-mini.component.js @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import AccountListItem from '../send/account-list-item/account-list-item.component' +import AccountListItem from '../../app/send/account-list-item/account-list-item.component' export default class AccountDropdownMini extends PureComponent { static propTypes = { diff --git a/ui/app/components/account-dropdown-mini/index.js b/ui/app/components/ui/account-dropdown-mini/index.js similarity index 100% rename from ui/app/components/account-dropdown-mini/index.js rename to ui/app/components/ui/account-dropdown-mini/index.js diff --git a/ui/app/components/account-dropdown-mini/tests/account-dropdown-mini.component.test.js b/ui/app/components/ui/account-dropdown-mini/tests/account-dropdown-mini.component.test.js similarity index 96% rename from ui/app/components/account-dropdown-mini/tests/account-dropdown-mini.component.test.js rename to ui/app/components/ui/account-dropdown-mini/tests/account-dropdown-mini.component.test.js index abd2f7c75239..bc74ceb3c229 100644 --- a/ui/app/components/account-dropdown-mini/tests/account-dropdown-mini.component.test.js +++ b/ui/app/components/ui/account-dropdown-mini/tests/account-dropdown-mini.component.test.js @@ -2,7 +2,7 @@ import React from 'react' import assert from 'assert' import { shallow } from 'enzyme' import AccountDropdownMini from '../account-dropdown-mini.component' -import AccountListItem from '../../send/account-list-item/account-list-item.component' +import AccountListItem from '../../../app/send/account-list-item/account-list-item.component' describe('AccountDropdownMini', () => { it('should render an account with an icon', () => { diff --git a/ui/app/components/alert/index.js b/ui/app/components/ui/alert/index.js similarity index 100% rename from ui/app/components/alert/index.js rename to ui/app/components/ui/alert/index.js diff --git a/ui/app/components/balance/balance.component.js b/ui/app/components/ui/balance/balance.component.js similarity index 91% rename from ui/app/components/balance/balance.component.js rename to ui/app/components/ui/balance/balance.component.js index 9d0018addde8..9a6f71ce5f6e 100644 --- a/ui/app/components/balance/balance.component.js +++ b/ui/app/components/ui/balance/balance.component.js @@ -2,9 +2,9 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import TokenBalance from '../token-balance' import Identicon from '../identicon' -import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display' -import { PRIMARY, SECONDARY } from '../../constants/common' -import { formatBalance } from '../../util' +import UserPreferencedCurrencyDisplay from '../../app/user-preferenced-currency-display' +import { PRIMARY, SECONDARY } from '../../../helpers/constants/common' +import { formatBalance } from '../../../helpers/utils/util' export default class Balance extends PureComponent { static propTypes = { diff --git a/ui/app/components/balance/balance.container.js b/ui/app/components/ui/balance/balance.container.js similarity index 96% rename from ui/app/components/balance/balance.container.js rename to ui/app/components/ui/balance/balance.container.js index 1cd6df5cea1b..2ad5c5ad8a64 100644 --- a/ui/app/components/balance/balance.container.js +++ b/ui/app/components/ui/balance/balance.container.js @@ -8,7 +8,7 @@ import { getMetaMaskAccounts, getIsMainnet, preferencesSelector, -} from '../../selectors' +} from '../../../selectors/selectors' const mapStateToProps = state => { const { showFiatInTestnets } = preferencesSelector(state) diff --git a/ui/app/components/balance/index.js b/ui/app/components/ui/balance/index.js similarity index 100% rename from ui/app/components/balance/index.js rename to ui/app/components/ui/balance/index.js diff --git a/ui/app/components/breadcrumbs/breadcrumbs.component.js b/ui/app/components/ui/breadcrumbs/breadcrumbs.component.js similarity index 100% rename from ui/app/components/breadcrumbs/breadcrumbs.component.js rename to ui/app/components/ui/breadcrumbs/breadcrumbs.component.js diff --git a/ui/app/components/breadcrumbs/index.js b/ui/app/components/ui/breadcrumbs/index.js similarity index 100% rename from ui/app/components/breadcrumbs/index.js rename to ui/app/components/ui/breadcrumbs/index.js diff --git a/ui/app/components/breadcrumbs/index.scss b/ui/app/components/ui/breadcrumbs/index.scss similarity index 100% rename from ui/app/components/breadcrumbs/index.scss rename to ui/app/components/ui/breadcrumbs/index.scss diff --git a/ui/app/components/breadcrumbs/tests/breadcrumbs.component.test.js b/ui/app/components/ui/breadcrumbs/tests/breadcrumbs.component.test.js similarity index 100% rename from ui/app/components/breadcrumbs/tests/breadcrumbs.component.test.js rename to ui/app/components/ui/breadcrumbs/tests/breadcrumbs.component.test.js diff --git a/ui/app/components/button-group/button-group.component.js b/ui/app/components/ui/button-group/button-group.component.js similarity index 100% rename from ui/app/components/button-group/button-group.component.js rename to ui/app/components/ui/button-group/button-group.component.js diff --git a/ui/app/components/button-group/button-group.stories.js b/ui/app/components/ui/button-group/button-group.stories.js similarity index 97% rename from ui/app/components/button-group/button-group.stories.js rename to ui/app/components/ui/button-group/button-group.stories.js index 14e1a7e49627..c58c628b3353 100644 --- a/ui/app/components/button-group/button-group.stories.js +++ b/ui/app/components/ui/button-group/button-group.stories.js @@ -1,7 +1,7 @@ import React from 'react' import { storiesOf } from '@storybook/react' import { action } from '@storybook/addon-actions' -import ButtonGroup from './' +import ButtonGroup from '.' import Button from '../button' import { text, boolean } from '@storybook/addon-knobs/react' diff --git a/ui/app/components/button-group/index.js b/ui/app/components/ui/button-group/index.js similarity index 100% rename from ui/app/components/button-group/index.js rename to ui/app/components/ui/button-group/index.js diff --git a/ui/app/components/button-group/index.scss b/ui/app/components/ui/button-group/index.scss similarity index 100% rename from ui/app/components/button-group/index.scss rename to ui/app/components/ui/button-group/index.scss diff --git a/ui/app/components/button-group/tests/button-group-component.test.js b/ui/app/components/ui/button-group/tests/button-group-component.test.js similarity index 100% rename from ui/app/components/button-group/tests/button-group-component.test.js rename to ui/app/components/ui/button-group/tests/button-group-component.test.js diff --git a/ui/app/components/button/button.component.js b/ui/app/components/ui/button/button.component.js similarity index 100% rename from ui/app/components/button/button.component.js rename to ui/app/components/ui/button/button.component.js diff --git a/ui/app/components/button/button.stories.js b/ui/app/components/ui/button/button.stories.js similarity index 97% rename from ui/app/components/button/button.stories.js rename to ui/app/components/ui/button/button.stories.js index dec084a2571f..667824a4780a 100644 --- a/ui/app/components/button/button.stories.js +++ b/ui/app/components/ui/button/button.stories.js @@ -1,7 +1,7 @@ import React from 'react' import { storiesOf } from '@storybook/react' import { action } from '@storybook/addon-actions' -import Button from './' +import Button from '.' import { text } from '@storybook/addon-knobs/react' storiesOf('Button', module) diff --git a/ui/app/components/button/index.js b/ui/app/components/ui/button/index.js similarity index 100% rename from ui/app/components/button/index.js rename to ui/app/components/ui/button/index.js diff --git a/ui/app/components/card/card.component.js b/ui/app/components/ui/card/card.component.js similarity index 100% rename from ui/app/components/card/card.component.js rename to ui/app/components/ui/card/card.component.js diff --git a/ui/app/components/card/index.js b/ui/app/components/ui/card/index.js similarity index 100% rename from ui/app/components/card/index.js rename to ui/app/components/ui/card/index.js diff --git a/ui/app/components/card/index.scss b/ui/app/components/ui/card/index.scss similarity index 100% rename from ui/app/components/card/index.scss rename to ui/app/components/ui/card/index.scss diff --git a/ui/app/components/card/tests/card.component.test.js b/ui/app/components/ui/card/tests/card.component.test.js similarity index 100% rename from ui/app/components/card/tests/card.component.test.js rename to ui/app/components/ui/card/tests/card.component.test.js diff --git a/ui/app/components/copyButton.js b/ui/app/components/ui/copyButton.js similarity index 100% rename from ui/app/components/copyButton.js rename to ui/app/components/ui/copyButton.js diff --git a/ui/app/components/currency-display/currency-display.component.js b/ui/app/components/ui/currency-display/currency-display.component.js similarity index 95% rename from ui/app/components/currency-display/currency-display.component.js rename to ui/app/components/ui/currency-display/currency-display.component.js index 6a743cc4ed03..04dd89892483 100644 --- a/ui/app/components/currency-display/currency-display.component.js +++ b/ui/app/components/ui/currency-display/currency-display.component.js @@ -1,7 +1,7 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import { GWEI } from '../../constants/common' +import { GWEI } from '../../../helpers/constants/common' export default class CurrencyDisplay extends PureComponent { static propTypes = { diff --git a/ui/app/components/currency-display/currency-display.container.js b/ui/app/components/ui/currency-display/currency-display.container.js similarity index 92% rename from ui/app/components/currency-display/currency-display.container.js rename to ui/app/components/ui/currency-display/currency-display.container.js index e581f8a5e354..093d99c8e0e9 100644 --- a/ui/app/components/currency-display/currency-display.container.js +++ b/ui/app/components/ui/currency-display/currency-display.container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import CurrencyDisplay from './currency-display.component' -import { getValueFromWeiHex, formatCurrency } from '../../helpers/confirm-transaction/util' +import { getValueFromWeiHex, formatCurrency } from '../../../helpers/utils/confirm-tx.util' const mapStateToProps = state => { const { metamask: { nativeCurrency, currentCurrency, conversionRate } } = state diff --git a/ui/app/components/currency-display/index.js b/ui/app/components/ui/currency-display/index.js similarity index 100% rename from ui/app/components/currency-display/index.js rename to ui/app/components/ui/currency-display/index.js diff --git a/ui/app/components/currency-display/index.scss b/ui/app/components/ui/currency-display/index.scss similarity index 100% rename from ui/app/components/currency-display/index.scss rename to ui/app/components/ui/currency-display/index.scss diff --git a/ui/app/components/currency-display/tests/currency-display.component.test.js b/ui/app/components/ui/currency-display/tests/currency-display.component.test.js similarity index 100% rename from ui/app/components/currency-display/tests/currency-display.component.test.js rename to ui/app/components/ui/currency-display/tests/currency-display.component.test.js diff --git a/ui/app/components/currency-display/tests/currency-display.container.test.js b/ui/app/components/ui/currency-display/tests/currency-display.container.test.js similarity index 100% rename from ui/app/components/currency-display/tests/currency-display.container.test.js rename to ui/app/components/ui/currency-display/tests/currency-display.container.test.js diff --git a/ui/app/components/currency-input/currency-input.component.js b/ui/app/components/ui/currency-input/currency-input.component.js similarity index 97% rename from ui/app/components/currency-input/currency-input.component.js rename to ui/app/components/ui/currency-input/currency-input.component.js index 30e0e919bb69..b5be0972bedc 100644 --- a/ui/app/components/currency-input/currency-input.component.js +++ b/ui/app/components/ui/currency-input/currency-input.component.js @@ -2,8 +2,8 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import UnitInput from '../unit-input' import CurrencyDisplay from '../currency-display' -import { getValueFromWeiHex, getWeiHexFromDecimalValue } from '../../helpers/conversions.util' -import { ETH } from '../../constants/common' +import { getValueFromWeiHex, getWeiHexFromDecimalValue } from '../../../helpers/utils/conversions.util' +import { ETH } from '../../../helpers/constants/common' /** * Component that allows user to enter currency values as a number, and props receive a converted diff --git a/ui/app/components/currency-input/currency-input.container.js b/ui/app/components/ui/currency-input/currency-input.container.js similarity index 85% rename from ui/app/components/currency-input/currency-input.container.js rename to ui/app/components/ui/currency-input/currency-input.container.js index 428be45579ca..b5d7dfe6df97 100644 --- a/ui/app/components/currency-input/currency-input.container.js +++ b/ui/app/components/ui/currency-input/currency-input.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import CurrencyInput from './currency-input.component' -import { ETH } from '../../constants/common' -import {getIsMainnet, preferencesSelector} from '../../selectors' +import { ETH } from '../../../helpers/constants/common' +import {getIsMainnet, preferencesSelector} from '../../../selectors/selectors' const mapStateToProps = state => { const { metamask: { nativeCurrency, currentCurrency, conversionRate } } = state diff --git a/ui/app/components/currency-input/index.js b/ui/app/components/ui/currency-input/index.js similarity index 100% rename from ui/app/components/currency-input/index.js rename to ui/app/components/ui/currency-input/index.js diff --git a/ui/app/components/currency-input/index.scss b/ui/app/components/ui/currency-input/index.scss similarity index 100% rename from ui/app/components/currency-input/index.scss rename to ui/app/components/ui/currency-input/index.scss diff --git a/ui/app/components/currency-input/tests/currency-input.component.test.js b/ui/app/components/ui/currency-input/tests/currency-input.component.test.js similarity index 100% rename from ui/app/components/currency-input/tests/currency-input.component.test.js rename to ui/app/components/ui/currency-input/tests/currency-input.component.test.js diff --git a/ui/app/components/currency-input/tests/currency-input.container.test.js b/ui/app/components/ui/currency-input/tests/currency-input.container.test.js similarity index 100% rename from ui/app/components/currency-input/tests/currency-input.container.test.js rename to ui/app/components/ui/currency-input/tests/currency-input.container.test.js diff --git a/ui/app/components/editable-label.js b/ui/app/components/ui/editable-label.js similarity index 100% rename from ui/app/components/editable-label.js rename to ui/app/components/ui/editable-label.js diff --git a/ui/app/components/error-message/error-message.component.js b/ui/app/components/ui/error-message/error-message.component.js similarity index 100% rename from ui/app/components/error-message/error-message.component.js rename to ui/app/components/ui/error-message/error-message.component.js diff --git a/ui/app/components/error-message/index.js b/ui/app/components/ui/error-message/index.js similarity index 100% rename from ui/app/components/error-message/index.js rename to ui/app/components/ui/error-message/index.js diff --git a/ui/app/components/error-message/index.scss b/ui/app/components/ui/error-message/index.scss similarity index 100% rename from ui/app/components/error-message/index.scss rename to ui/app/components/ui/error-message/index.scss diff --git a/ui/app/components/error-message/tests/error-message.component.test.js b/ui/app/components/ui/error-message/tests/error-message.component.test.js similarity index 100% rename from ui/app/components/error-message/tests/error-message.component.test.js rename to ui/app/components/ui/error-message/tests/error-message.component.test.js diff --git a/ui/app/components/eth-balance.js b/ui/app/components/ui/eth-balance.js similarity index 98% rename from ui/app/components/eth-balance.js rename to ui/app/components/ui/eth-balance.js index 2f6395a2daa9..7d577b7162a3 100644 --- a/ui/app/components/eth-balance.js +++ b/ui/app/components/ui/eth-balance.js @@ -5,7 +5,7 @@ const { inherits } = require('util') const { formatBalance, generateBalanceObject, -} = require('../util') +} = require('../../helpers/utils/util') const Tooltip = require('./tooltip.js') const FiatValue = require('./fiat-value.js') diff --git a/ui/app/components/export-text-container/export-text-container.component.js b/ui/app/components/ui/export-text-container/export-text-container.component.js similarity index 95% rename from ui/app/components/export-text-container/export-text-container.component.js rename to ui/app/components/ui/export-text-container/export-text-container.component.js index c2546fa9b1d6..c632e8f26910 100644 --- a/ui/app/components/export-text-container/export-text-container.component.js +++ b/ui/app/components/ui/export-text-container/export-text-container.component.js @@ -2,7 +2,7 @@ const { Component } = require('react') const PropTypes = require('prop-types') const h = require('react-hyperscript') const copyToClipboard = require('copy-to-clipboard') -const { exportAsFile } = require('../../util') +const { exportAsFile } = require('../../../helpers/utils/util') class ExportTextContainer extends Component { render () { diff --git a/ui/app/components/export-text-container/index.js b/ui/app/components/ui/export-text-container/index.js similarity index 100% rename from ui/app/components/export-text-container/index.js rename to ui/app/components/ui/export-text-container/index.js diff --git a/ui/app/components/export-text-container/index.scss b/ui/app/components/ui/export-text-container/index.scss similarity index 100% rename from ui/app/components/export-text-container/index.scss rename to ui/app/components/ui/export-text-container/index.scss diff --git a/ui/app/components/fiat-value.js b/ui/app/components/ui/fiat-value.js similarity index 95% rename from ui/app/components/fiat-value.js rename to ui/app/components/ui/fiat-value.js index 56465fc9d5e6..02111ba49dd4 100644 --- a/ui/app/components/fiat-value.js +++ b/ui/app/components/ui/fiat-value.js @@ -1,7 +1,7 @@ const Component = require('react').Component const h = require('react-hyperscript') const inherits = require('util').inherits -const formatBalance = require('../util').formatBalance +const formatBalance = require('../../helpers/utils/util').formatBalance module.exports = FiatValue diff --git a/ui/app/components/hex-to-decimal/hex-to-decimal.component.js b/ui/app/components/ui/hex-to-decimal/hex-to-decimal.component.js similarity index 85% rename from ui/app/components/hex-to-decimal/hex-to-decimal.component.js rename to ui/app/components/ui/hex-to-decimal/hex-to-decimal.component.js index 6847a6919a7a..f03aaf2550e9 100644 --- a/ui/app/components/hex-to-decimal/hex-to-decimal.component.js +++ b/ui/app/components/ui/hex-to-decimal/hex-to-decimal.component.js @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import { hexToDecimal } from '../../helpers/conversions.util' +import { hexToDecimal } from '../../../helpers/utils/conversions.util' export default class HexToDecimal extends PureComponent { static propTypes = { diff --git a/ui/app/components/hex-to-decimal/index.js b/ui/app/components/ui/hex-to-decimal/index.js similarity index 100% rename from ui/app/components/hex-to-decimal/index.js rename to ui/app/components/ui/hex-to-decimal/index.js diff --git a/ui/app/components/hex-to-decimal/tests/hex-to-decimal.component.test.js b/ui/app/components/ui/hex-to-decimal/tests/hex-to-decimal.component.test.js similarity index 100% rename from ui/app/components/hex-to-decimal/tests/hex-to-decimal.component.test.js rename to ui/app/components/ui/hex-to-decimal/tests/hex-to-decimal.component.test.js diff --git a/ui/app/components/identicon/identicon.component.js b/ui/app/components/ui/identicon/identicon.component.js similarity index 94% rename from ui/app/components/identicon/identicon.component.js rename to ui/app/components/ui/identicon/identicon.component.js index b892e5ae5e32..88521247c598 100644 --- a/ui/app/components/identicon/identicon.component.js +++ b/ui/app/components/ui/identicon/identicon.component.js @@ -1,9 +1,9 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import { toDataUrl } from '../../../lib/blockies' +import { toDataUrl } from '../../../../lib/blockies' import contractMap from 'eth-contract-metadata' -import { checksumAddress } from '../../../app/util' +import { checksumAddress } from '../../../helpers/utils/util' import Jazzicon from '../jazzicon' const getStyles = diameter => ( diff --git a/ui/app/components/identicon/identicon.container.js b/ui/app/components/ui/identicon/identicon.container.js similarity index 100% rename from ui/app/components/identicon/identicon.container.js rename to ui/app/components/ui/identicon/identicon.container.js diff --git a/ui/app/components/identicon/index.js b/ui/app/components/ui/identicon/index.js similarity index 100% rename from ui/app/components/identicon/index.js rename to ui/app/components/ui/identicon/index.js diff --git a/ui/app/components/identicon/index.scss b/ui/app/components/ui/identicon/index.scss similarity index 100% rename from ui/app/components/identicon/index.scss rename to ui/app/components/ui/identicon/index.scss diff --git a/ui/app/components/identicon/tests/identicon.component.test.js b/ui/app/components/ui/identicon/tests/identicon.component.test.js similarity index 100% rename from ui/app/components/identicon/tests/identicon.component.test.js rename to ui/app/components/ui/identicon/tests/identicon.component.test.js diff --git a/ui/app/components/jazzicon/index.js b/ui/app/components/ui/jazzicon/index.js similarity index 100% rename from ui/app/components/jazzicon/index.js rename to ui/app/components/ui/jazzicon/index.js diff --git a/ui/app/components/jazzicon/jazzicon.component.js b/ui/app/components/ui/jazzicon/jazzicon.component.js similarity index 96% rename from ui/app/components/jazzicon/jazzicon.component.js rename to ui/app/components/ui/jazzicon/jazzicon.component.js index fcb1c59b196d..3a17e446f8ae 100644 --- a/ui/app/components/jazzicon/jazzicon.component.js +++ b/ui/app/components/ui/jazzicon/jazzicon.component.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types' import isNode from 'detect-node' import { findDOMNode } from 'react-dom' import jazzicon from 'jazzicon' -import iconFactoryGenerator from '../../../lib/icon-factory' +import iconFactoryGenerator from '../../../../lib/icon-factory' const iconFactory = iconFactoryGenerator(jazzicon) /** diff --git a/ui/app/components/loading-screen/index.js b/ui/app/components/ui/loading-screen/index.js similarity index 100% rename from ui/app/components/loading-screen/index.js rename to ui/app/components/ui/loading-screen/index.js diff --git a/ui/app/components/loading-screen/loading-screen.component.js b/ui/app/components/ui/loading-screen/loading-screen.component.js similarity index 100% rename from ui/app/components/loading-screen/loading-screen.component.js rename to ui/app/components/ui/loading-screen/loading-screen.component.js diff --git a/ui/app/components/lock-icon/index.js b/ui/app/components/ui/lock-icon/index.js similarity index 100% rename from ui/app/components/lock-icon/index.js rename to ui/app/components/ui/lock-icon/index.js diff --git a/ui/app/components/lock-icon/lock-icon.component.js b/ui/app/components/ui/lock-icon/lock-icon.component.js similarity index 100% rename from ui/app/components/lock-icon/lock-icon.component.js rename to ui/app/components/ui/lock-icon/lock-icon.component.js diff --git a/ui/app/components/mascot.js b/ui/app/components/ui/mascot.js similarity index 100% rename from ui/app/components/mascot.js rename to ui/app/components/ui/mascot.js diff --git a/ui/app/components/page-container/index.js b/ui/app/components/ui/page-container/index.js similarity index 100% rename from ui/app/components/page-container/index.js rename to ui/app/components/ui/page-container/index.js diff --git a/ui/app/components/page-container/index.scss b/ui/app/components/ui/page-container/index.scss similarity index 100% rename from ui/app/components/page-container/index.scss rename to ui/app/components/ui/page-container/index.scss diff --git a/ui/app/components/page-container/page-container-content.component.js b/ui/app/components/ui/page-container/page-container-content.component.js similarity index 100% rename from ui/app/components/page-container/page-container-content.component.js rename to ui/app/components/ui/page-container/page-container-content.component.js diff --git a/ui/app/components/page-container/page-container-footer/index.js b/ui/app/components/ui/page-container/page-container-footer/index.js similarity index 100% rename from ui/app/components/page-container/page-container-footer/index.js rename to ui/app/components/ui/page-container/page-container-footer/index.js diff --git a/ui/app/components/page-container/page-container-footer/page-container-footer.component.js b/ui/app/components/ui/page-container/page-container-footer/page-container-footer.component.js similarity index 100% rename from ui/app/components/page-container/page-container-footer/page-container-footer.component.js rename to ui/app/components/ui/page-container/page-container-footer/page-container-footer.component.js diff --git a/ui/app/components/page-container/page-container-footer/tests/page-container-footer.component.test.js b/ui/app/components/ui/page-container/page-container-footer/tests/page-container-footer.component.test.js similarity index 100% rename from ui/app/components/page-container/page-container-footer/tests/page-container-footer.component.test.js rename to ui/app/components/ui/page-container/page-container-footer/tests/page-container-footer.component.test.js diff --git a/ui/app/components/page-container/page-container-header/index.js b/ui/app/components/ui/page-container/page-container-header/index.js similarity index 100% rename from ui/app/components/page-container/page-container-header/index.js rename to ui/app/components/ui/page-container/page-container-header/index.js diff --git a/ui/app/components/page-container/page-container-header/page-container-header.component.js b/ui/app/components/ui/page-container/page-container-header/page-container-header.component.js similarity index 100% rename from ui/app/components/page-container/page-container-header/page-container-header.component.js rename to ui/app/components/ui/page-container/page-container-header/page-container-header.component.js diff --git a/ui/app/components/page-container/page-container-header/tests/page-container-header.component.test.js b/ui/app/components/ui/page-container/page-container-header/tests/page-container-header.component.test.js similarity index 100% rename from ui/app/components/page-container/page-container-header/tests/page-container-header.component.test.js rename to ui/app/components/ui/page-container/page-container-header/tests/page-container-header.component.test.js diff --git a/ui/app/components/page-container/page-container.component.js b/ui/app/components/ui/page-container/page-container.component.js similarity index 100% rename from ui/app/components/page-container/page-container.component.js rename to ui/app/components/ui/page-container/page-container.component.js diff --git a/ui/app/components/page-container/tests/page-container.component.test.js b/ui/app/components/ui/page-container/tests/page-container.component.test.js similarity index 100% rename from ui/app/components/page-container/tests/page-container.component.test.js rename to ui/app/components/ui/page-container/tests/page-container.component.test.js diff --git a/ui/app/components/qr-code.js b/ui/app/components/ui/qr-code.js similarity index 96% rename from ui/app/components/qr-code.js rename to ui/app/components/ui/qr-code.js index 312815891f5c..351e072e2c84 100644 --- a/ui/app/components/qr-code.js +++ b/ui/app/components/ui/qr-code.js @@ -5,7 +5,7 @@ const inherits = require('util').inherits const connect = require('react-redux').connect const { isHexPrefixed } = require('ethereumjs-util') const ReadOnlyInput = require('./readonly-input') -const { checksumAddress } = require('../util') +const { checksumAddress } = require('../../helpers/utils/util') module.exports = connect(mapStateToProps)(QrCodeView) diff --git a/ui/app/components/readonly-input.js b/ui/app/components/ui/readonly-input.js similarity index 100% rename from ui/app/components/readonly-input.js rename to ui/app/components/ui/readonly-input.js diff --git a/ui/app/components/sender-to-recipient/index.js b/ui/app/components/ui/sender-to-recipient/index.js similarity index 100% rename from ui/app/components/sender-to-recipient/index.js rename to ui/app/components/ui/sender-to-recipient/index.js diff --git a/ui/app/components/sender-to-recipient/index.scss b/ui/app/components/ui/sender-to-recipient/index.scss similarity index 100% rename from ui/app/components/sender-to-recipient/index.scss rename to ui/app/components/ui/sender-to-recipient/index.scss diff --git a/ui/app/components/sender-to-recipient/sender-to-recipient.component.js b/ui/app/components/ui/sender-to-recipient/sender-to-recipient.component.js similarity index 96% rename from ui/app/components/sender-to-recipient/sender-to-recipient.component.js rename to ui/app/components/ui/sender-to-recipient/sender-to-recipient.component.js index 65102a7ad177..57b595d48ff9 100644 --- a/ui/app/components/sender-to-recipient/sender-to-recipient.component.js +++ b/ui/app/components/ui/sender-to-recipient/sender-to-recipient.component.js @@ -5,7 +5,7 @@ import Identicon from '../identicon' import Tooltip from '../tooltip-v2' import copyToClipboard from 'copy-to-clipboard' import { DEFAULT_VARIANT, CARDS_VARIANT, FLAT_VARIANT } from './sender-to-recipient.constants' -import { checksumAddress } from '../../util' +import { checksumAddress } from '../../../helpers/utils/util' const variantHash = { [DEFAULT_VARIANT]: 'sender-to-recipient--default', @@ -97,7 +97,9 @@ export default class SenderToRecipient extends PureComponent { onClick={() => { this.setState({ recipientAddressCopied: true }) copyToClipboard(checksummedRecipientAddress) - onRecipientClick() + if (onRecipientClick) { + onRecipientClick() + } }} > { this.renderRecipientIdenticon() } @@ -164,7 +166,9 @@ export default class SenderToRecipient extends PureComponent { onClick={() => { this.setState({ senderAddressCopied: true }) copyToClipboard(checksummedSenderAddress) - onSenderClick() + if (onSenderClick) { + onSenderClick() + } }} > { this.renderSenderIdenticon() } diff --git a/ui/app/components/sender-to-recipient/sender-to-recipient.constants.js b/ui/app/components/ui/sender-to-recipient/sender-to-recipient.constants.js similarity index 100% rename from ui/app/components/sender-to-recipient/sender-to-recipient.constants.js rename to ui/app/components/ui/sender-to-recipient/sender-to-recipient.constants.js diff --git a/ui/app/components/spinner/index.js b/ui/app/components/ui/spinner/index.js similarity index 100% rename from ui/app/components/spinner/index.js rename to ui/app/components/ui/spinner/index.js diff --git a/ui/app/components/spinner/spinner.component.js b/ui/app/components/ui/spinner/spinner.component.js similarity index 100% rename from ui/app/components/spinner/spinner.component.js rename to ui/app/components/ui/spinner/spinner.component.js diff --git a/ui/app/components/tabs/index.js b/ui/app/components/ui/tabs/index.js similarity index 100% rename from ui/app/components/tabs/index.js rename to ui/app/components/ui/tabs/index.js diff --git a/ui/app/components/tabs/index.scss b/ui/app/components/ui/tabs/index.scss similarity index 88% rename from ui/app/components/tabs/index.scss rename to ui/app/components/ui/tabs/index.scss index a3b42f8e3c05..25143ff353ab 100644 --- a/ui/app/components/tabs/index.scss +++ b/ui/app/components/ui/tabs/index.scss @@ -1,4 +1,4 @@ -@import './tab/index'; +@import 'tab/index'; .tabs { &__list { diff --git a/ui/app/components/tabs/tab/index.js b/ui/app/components/ui/tabs/tab/index.js similarity index 100% rename from ui/app/components/tabs/tab/index.js rename to ui/app/components/ui/tabs/tab/index.js diff --git a/ui/app/components/tabs/tab/index.scss b/ui/app/components/ui/tabs/tab/index.scss similarity index 100% rename from ui/app/components/tabs/tab/index.scss rename to ui/app/components/ui/tabs/tab/index.scss diff --git a/ui/app/components/tabs/tab/tab.component.js b/ui/app/components/ui/tabs/tab/tab.component.js similarity index 100% rename from ui/app/components/tabs/tab/tab.component.js rename to ui/app/components/ui/tabs/tab/tab.component.js diff --git a/ui/app/components/tabs/tabs.component.js b/ui/app/components/ui/tabs/tabs.component.js similarity index 100% rename from ui/app/components/tabs/tabs.component.js rename to ui/app/components/ui/tabs/tabs.component.js diff --git a/ui/app/components/text-field/index.js b/ui/app/components/ui/text-field/index.js similarity index 100% rename from ui/app/components/text-field/index.js rename to ui/app/components/ui/text-field/index.js diff --git a/ui/app/components/text-field/text-field.component.js b/ui/app/components/ui/text-field/text-field.component.js similarity index 100% rename from ui/app/components/text-field/text-field.component.js rename to ui/app/components/ui/text-field/text-field.component.js diff --git a/ui/app/components/text-field/text-field.stories.js b/ui/app/components/ui/text-field/text-field.stories.js similarity index 96% rename from ui/app/components/text-field/text-field.stories.js rename to ui/app/components/ui/text-field/text-field.stories.js index c00873b8a304..337f78ecf73e 100644 --- a/ui/app/components/text-field/text-field.stories.js +++ b/ui/app/components/ui/text-field/text-field.stories.js @@ -1,6 +1,6 @@ import React from 'react' import { storiesOf } from '@storybook/react' -import TextField from './' +import TextField from '.' storiesOf('TextField', module) .add('text', () => diff --git a/ui/app/components/token-balance/index.js b/ui/app/components/ui/token-balance/index.js similarity index 100% rename from ui/app/components/token-balance/index.js rename to ui/app/components/ui/token-balance/index.js diff --git a/ui/app/components/token-balance/index.scss b/ui/app/components/ui/token-balance/index.scss similarity index 100% rename from ui/app/components/token-balance/index.scss rename to ui/app/components/ui/token-balance/index.scss diff --git a/ui/app/components/token-balance/token-balance.component.js b/ui/app/components/ui/token-balance/token-balance.component.js similarity index 100% rename from ui/app/components/token-balance/token-balance.component.js rename to ui/app/components/ui/token-balance/token-balance.component.js diff --git a/ui/app/components/token-balance/token-balance.container.js b/ui/app/components/ui/token-balance/token-balance.container.js similarity index 69% rename from ui/app/components/token-balance/token-balance.container.js rename to ui/app/components/ui/token-balance/token-balance.container.js index adc001f8319a..a0f1efc20dfe 100644 --- a/ui/app/components/token-balance/token-balance.container.js +++ b/ui/app/components/ui/token-balance/token-balance.container.js @@ -1,8 +1,8 @@ import { connect } from 'react-redux' import { compose } from 'recompose' -import withTokenTracker from '../../higher-order-components/with-token-tracker' +import withTokenTracker from '../../../helpers/higher-order-components/with-token-tracker' import TokenBalance from './token-balance.component' -import selectors from '../../selectors' +import selectors from '../../../selectors/selectors' const mapStateToProps = state => { return { diff --git a/ui/app/components/token-currency-display/index.js b/ui/app/components/ui/token-currency-display/index.js similarity index 100% rename from ui/app/components/token-currency-display/index.js rename to ui/app/components/ui/token-currency-display/index.js diff --git a/ui/app/components/token-currency-display/token-currency-display.component.js b/ui/app/components/ui/token-currency-display/token-currency-display.component.js similarity index 89% rename from ui/app/components/token-currency-display/token-currency-display.component.js rename to ui/app/components/ui/token-currency-display/token-currency-display.component.js index f49846449aad..3c2722b365f5 100644 --- a/ui/app/components/token-currency-display/token-currency-display.component.js +++ b/ui/app/components/ui/token-currency-display/token-currency-display.component.js @@ -1,8 +1,8 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import CurrencyDisplay from '../currency-display' -import { getTokenData } from '../../helpers/transactions.util' -import { getTokenValue, calcTokenAmount } from '../../token-util' +import { getTokenData } from '../../../helpers/utils/transactions.util' +import { getTokenValue, calcTokenAmount } from '../../../helpers/utils/token-util' export default class TokenCurrencyDisplay extends PureComponent { static propTypes = { diff --git a/ui/app/components/token-input/index.js b/ui/app/components/ui/token-input/index.js similarity index 100% rename from ui/app/components/token-input/index.js rename to ui/app/components/ui/token-input/index.js diff --git a/ui/app/components/token-input/tests/token-input.component.test.js b/ui/app/components/ui/token-input/tests/token-input.component.test.js similarity index 100% rename from ui/app/components/token-input/tests/token-input.component.test.js rename to ui/app/components/ui/token-input/tests/token-input.component.test.js diff --git a/ui/app/components/token-input/tests/token-input.container.test.js b/ui/app/components/ui/token-input/tests/token-input.container.test.js similarity index 100% rename from ui/app/components/token-input/tests/token-input.container.test.js rename to ui/app/components/ui/token-input/tests/token-input.container.test.js diff --git a/ui/app/components/token-input/token-input.component.js b/ui/app/components/ui/token-input/token-input.component.js similarity index 94% rename from ui/app/components/token-input/token-input.component.js rename to ui/app/components/ui/token-input/token-input.component.js index 398b762ec33b..c28af5fde6c0 100644 --- a/ui/app/components/token-input/token-input.component.js +++ b/ui/app/components/ui/token-input/token-input.component.js @@ -2,10 +2,10 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import UnitInput from '../unit-input' import CurrencyDisplay from '../currency-display' -import { getWeiHexFromDecimalValue } from '../../helpers/conversions.util' +import { getWeiHexFromDecimalValue } from '../../../helpers/utils/conversions.util' import ethUtil from 'ethereumjs-util' -import { conversionUtil, multiplyCurrencies } from '../../conversion-util' -import { ETH } from '../../constants/common' +import { conversionUtil, multiplyCurrencies } from '../../../helpers/utils/conversion-util' +import { ETH } from '../../../helpers/constants/common' /** * Component that allows user to enter token values as a number, and props receive a converted diff --git a/ui/app/components/token-input/token-input.container.js b/ui/app/components/ui/token-input/token-input.container.js similarity index 93% rename from ui/app/components/token-input/token-input.container.js rename to ui/app/components/ui/token-input/token-input.container.js index a00d200f7719..981cb3598b90 100644 --- a/ui/app/components/token-input/token-input.container.js +++ b/ui/app/components/ui/token-input/token-input.container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import TokenInput from './token-input.component' -import {getIsMainnet, getSelectedToken, getSelectedTokenExchangeRate, preferencesSelector} from '../../selectors' +import {getIsMainnet, getSelectedToken, getSelectedTokenExchangeRate, preferencesSelector} from '../../../selectors/selectors' const mapStateToProps = state => { const { metamask: { currentCurrency } } = state diff --git a/ui/app/components/tooltip-v2.js b/ui/app/components/ui/tooltip-v2.js similarity index 100% rename from ui/app/components/tooltip-v2.js rename to ui/app/components/ui/tooltip-v2.js diff --git a/ui/app/components/tooltip.js b/ui/app/components/ui/tooltip.js similarity index 100% rename from ui/app/components/tooltip.js rename to ui/app/components/ui/tooltip.js diff --git a/ui/app/components/unit-input/index.js b/ui/app/components/ui/unit-input/index.js similarity index 100% rename from ui/app/components/unit-input/index.js rename to ui/app/components/ui/unit-input/index.js diff --git a/ui/app/components/unit-input/index.scss b/ui/app/components/ui/unit-input/index.scss similarity index 100% rename from ui/app/components/unit-input/index.scss rename to ui/app/components/ui/unit-input/index.scss diff --git a/ui/app/components/unit-input/tests/unit-input.component.test.js b/ui/app/components/ui/unit-input/tests/unit-input.component.test.js similarity index 100% rename from ui/app/components/unit-input/tests/unit-input.component.test.js rename to ui/app/components/ui/unit-input/tests/unit-input.component.test.js diff --git a/ui/app/components/unit-input/unit-input.component.js b/ui/app/components/ui/unit-input/unit-input.component.js similarity index 97% rename from ui/app/components/unit-input/unit-input.component.js rename to ui/app/components/ui/unit-input/unit-input.component.js index 230eecfe66c6..7b414f17759a 100644 --- a/ui/app/components/unit-input/unit-input.component.js +++ b/ui/app/components/ui/unit-input/unit-input.component.js @@ -1,7 +1,7 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import { removeLeadingZeroes } from '../send/send.utils' +import { removeLeadingZeroes } from '../../app/send/send.utils' /** * Component that attaches a suffix or unit of measurement trailing user input, ex. 'ETH'. Also diff --git a/ui/app/css/itcss/components/index.scss b/ui/app/css/itcss/components/index.scss index 7eaf60ce8e95..f2f37bfa3d94 100644 --- a/ui/app/css/itcss/components/index.scss +++ b/ui/app/css/itcss/components/index.scss @@ -52,4 +52,4 @@ @import './tooltip.scss'; -@import '../../../components/index'; +@import '../../../components/app/index'; diff --git a/ui/app/css/itcss/components/tab-bar.scss b/ui/app/css/itcss/components/tab-bar.scss index 4f307797418a..bb9f8f261ed9 100644 --- a/ui/app/css/itcss/components/tab-bar.scss +++ b/ui/app/css/itcss/components/tab-bar.scss @@ -1,21 +1,73 @@ .tab-bar { display: flex; - flex-direction: row; + flex-direction: column; justify-content: flex-start; - align-items: flex-end; } .tab-bar__tab { + display: flex; + flex-flow: row nowrap; + align-items: flex-start; min-width: 0; flex: 0 0 auto; - padding: 15px 25px; - border-bottom: 1px solid $alto; box-sizing: border-box; - font-size: 18px; -} + font-size: 16px; + padding: 16px 24px; + opacity: .5; + transition: opacity 200ms ease-in-out; + + @media screen and (min-width: 576px) { + &:hover { + opacity: .4; + } + + &:active { + opacity: .6; + } + } + + @media screen and (max-width: 575px) { + font-size: 18px; + padding: 24px; + border-bottom: 1px solid $alto; + opacity: 1; + } + + &__content { + flex: 1 1 auto; + width: 0; + + &__description { + display: none; + + @media screen and (max-width: 575px) { + display: block; + font-size: 14px; + font-weight: 300; + margin-top: 8px; + min-height: 14px; + } + } + } + + &__caret { + display: none; + + @media screen and (max-width: 575px) { + display: block; + background-image: url('/images/caret-right.svg'); + width: 36px; + height: 36px; + opacity: .5; + background-size: contain; + background-repeat: no-repeat; + background-position: center; + } + } -.tab-bar__tab--active { - border-color: $black; + &--active { + opacity: 1 !important; + } } .tab-bar__grow-tab { diff --git a/ui/app/reducers/app.js b/ui/app/ducks/app/app.js similarity index 99% rename from ui/app/reducers/app.js rename to ui/app/ducks/app/app.js index 22cfe7f8d826..acbb5c9893b2 100644 --- a/ui/app/reducers/app.js +++ b/ui/app/ducks/app/app.js @@ -1,6 +1,6 @@ const extend = require('xtend') -const actions = require('../actions') -const txHelper = require('../../lib/tx-helper') +const actions = require('../../store/actions') +const txHelper = require('../../../lib/tx-helper') const log = require('loglevel') module.exports = reduceApp diff --git a/ui/app/ducks/confirm-transaction.duck.js b/ui/app/ducks/confirm-transaction/confirm-transaction.duck.js similarity index 97% rename from ui/app/ducks/confirm-transaction.duck.js rename to ui/app/ducks/confirm-transaction/confirm-transaction.duck.js index f75ff809a1d4..4edf8a70cce4 100644 --- a/ui/app/ducks/confirm-transaction.duck.js +++ b/ui/app/ducks/confirm-transaction/confirm-transaction.duck.js @@ -3,7 +3,7 @@ import { currentCurrencySelector, unconfirmedTransactionsHashSelector, getNativeCurrency, -} from '../selectors/confirm-transaction' +} from '../../selectors/confirm-transaction' import { getValueFromWeiHex, @@ -13,17 +13,17 @@ import { addEth, increaseLastGasPrice, hexGreaterThan, -} from '../helpers/confirm-transaction/util' +} from '../../helpers/utils/confirm-tx.util' import { getTokenData, getMethodData, isSmartContractAddress, sumHexes, -} from '../helpers/transactions.util' +} from '../../helpers/utils/transactions.util' -import { getSymbolAndDecimals } from '../token-util' -import { conversionUtil } from '../conversion-util' +import { getSymbolAndDecimals } from '../../helpers/utils/token-util' +import { conversionUtil } from '../../helpers/utils/conversion-util' import { addHexPrefix } from 'ethereumjs-util' // Actions diff --git a/ui/app/ducks/tests/confirm-transaction.duck.test.js b/ui/app/ducks/confirm-transaction/confirm-transaction.duck.test.js similarity index 99% rename from ui/app/ducks/tests/confirm-transaction.duck.test.js rename to ui/app/ducks/confirm-transaction/confirm-transaction.duck.test.js index eceacd0bd95e..483f2f56d698 100644 --- a/ui/app/ducks/tests/confirm-transaction.duck.test.js +++ b/ui/app/ducks/confirm-transaction/confirm-transaction.duck.test.js @@ -3,7 +3,7 @@ import configureMockStore from 'redux-mock-store' import thunk from 'redux-thunk' import sinon from 'sinon' -import ConfirmTransactionReducer, * as actions from '../confirm-transaction.duck.js' +import ConfirmTransactionReducer, * as actions from './confirm-transaction.duck.js' const initialState = { txData: {}, diff --git a/ui/app/ducks/tests/gas-duck.test.js b/ui/app/ducks/gas/gas-duck.test.js similarity index 98% rename from ui/app/ducks/tests/gas-duck.test.js rename to ui/app/ducks/gas/gas-duck.test.js index cd963aed42ce..c0152c74f167 100644 --- a/ui/app/ducks/tests/gas-duck.test.js +++ b/ui/app/ducks/gas/gas-duck.test.js @@ -3,8 +3,8 @@ import sinon from 'sinon' import proxyquire from 'proxyquire' -const GasDuck = proxyquire('../gas.duck.js', { - '../../lib/local-storage-helpers': { +const GasDuck = proxyquire('./gas.duck.js', { + '../../../lib/local-storage-helpers': { loadLocalStorageData: sinon.spy(), saveLocalStorageData: sinon.spy(), }, @@ -364,7 +364,9 @@ describe('Gas Duck', () => { {}, initState, { basicPriceAndTimeEstimatesLastRetrieved: 1000000 } - ) })) + ), + metamask: { provider: { type: 'ropsten' } }, + })) assert.deepEqual( mockDistpatch.getCall(0).args, [{ type: BASIC_GAS_ESTIMATE_LOADING_STARTED} ] @@ -428,7 +430,9 @@ describe('Gas Duck', () => { {}, initState, { priceAndTimeEstimatesLastRetrieved: 1000000 } - ) })) + ), + metamask: { provider: { type: 'ropsten' } }, + })) assert.deepEqual( mockDistpatch.getCall(0).args, [{ type: GAS_ESTIMATE_LOADING_STARTED} ] @@ -479,7 +483,9 @@ describe('Gas Duck', () => { gasprice: 50, }], } - ) })) + ), + metamask: { provider: { type: 'ropsten' } }, + })) assert.deepEqual( mockDistpatch.getCall(0).args, [{ type: GAS_ESTIMATE_LOADING_STARTED} ] diff --git a/ui/app/ducks/gas.duck.js b/ui/app/ducks/gas/gas.duck.js similarity index 98% rename from ui/app/ducks/gas.duck.js rename to ui/app/ducks/gas/gas.duck.js index 957b00163651..8eb68f8460cf 100644 --- a/ui/app/ducks/gas.duck.js +++ b/ui/app/ducks/gas/gas.duck.js @@ -3,10 +3,13 @@ import BigNumber from 'bignumber.js' import { loadLocalStorageData, saveLocalStorageData, -} from '../../lib/local-storage-helpers' +} from '../../../lib/local-storage-helpers' import { decGWEIToHexWEI, -} from '../helpers/conversions.util' +} from '../../helpers/utils/conversions.util' +import { + isEthereumNetwork, +} from '../../selectors/selectors' // Actions const BASIC_GAS_ESTIMATE_LOADING_FINISHED = 'metamask/gas/BASIC_GAS_ESTIMATE_LOADING_FINISHED' @@ -356,10 +359,16 @@ function inliersByIQR (data, prop) { export function fetchGasEstimates (blockTime) { return (dispatch, getState) => { + const state = getState() + + if (isEthereumNetwork(state)) { + return Promise.resolve(null) + } + const { priceAndTimeEstimatesLastRetrieved, priceAndTimeEstimates, - } = getState().gas + } = state.gas const timeLastRetrieved = priceAndTimeEstimatesLastRetrieved || loadLocalStorageData('GAS_API_ESTIMATES_LAST_RETRIEVED') || 0 dispatch(gasEstimatesLoadingStarted()) diff --git a/ui/app/reducers.js b/ui/app/ducks/index.js similarity index 85% rename from ui/app/reducers.js rename to ui/app/ducks/index.js index 786af853de05..2d33edcfa59b 100644 --- a/ui/app/reducers.js +++ b/ui/app/ducks/index.js @@ -5,12 +5,12 @@ const copyToClipboard = require('copy-to-clipboard') // // Sub-Reducers take in the complete state and return their sub-state // -const reduceMetamask = require('./reducers/metamask') -const reduceApp = require('./reducers/app') -const reduceLocale = require('./reducers/locale') -const reduceSend = require('./ducks/send.duck').default -import reduceConfirmTransaction from './ducks/confirm-transaction.duck' -import reduceGas from './ducks/gas.duck' +const reduceMetamask = require('./metamask/metamask') +const reduceApp = require('./app/app') +const reduceLocale = require('./locale/locale') +const reduceSend = require('./send/send.duck').default +import reduceConfirmTransaction from './confirm-transaction/confirm-transaction.duck' +import reduceGas from './gas/gas.duck' window.METAMASK_CACHED_LOG_STATE = null diff --git a/ui/app/reducers/locale.js b/ui/app/ducks/locale/locale.js similarity index 88% rename from ui/app/reducers/locale.js rename to ui/app/ducks/locale/locale.js index bdd97acb43c1..bb8e1b08e466 100644 --- a/ui/app/reducers/locale.js +++ b/ui/app/ducks/locale/locale.js @@ -1,5 +1,5 @@ const extend = require('xtend') -const actions = require('../actions') +const actions = require('../../store/actions') module.exports = reduceMetamask diff --git a/ui/app/reducers/metamask.js b/ui/app/ducks/metamask/metamask.js similarity index 96% rename from ui/app/reducers/metamask.js rename to ui/app/ducks/metamask/metamask.js index c1aa20bf78a7..864229e839ce 100644 --- a/ui/app/reducers/metamask.js +++ b/ui/app/ducks/metamask/metamask.js @@ -1,9 +1,8 @@ const extend = require('xtend') -const actions = require('../actions') -const MetamascaraPlatform = require('../../../app/scripts/platforms/window') -const { getEnvironmentType } = require('../../../app/scripts/lib/util') -const { ENVIRONMENT_TYPE_POPUP } = require('../../../app/scripts/lib/enums') -const { OLD_UI_NETWORK_TYPE } = require('../../../app/scripts/controllers/network/enums') +const actions = require('../../store/actions') +const { getEnvironmentType } = require('../../../../app/scripts/lib/util') +const { ENVIRONMENT_TYPE_POPUP } = require('../../../../app/scripts/lib/enums') +const { OLD_UI_NETWORK_TYPE } = require('../../../../app/scripts/controllers/network/enums') module.exports = reduceMetamask @@ -15,7 +14,6 @@ function reduceMetamask (state, action) { isInitialized: false, isUnlocked: false, isAccountMenuOpen: false, - isMascara: window.platform instanceof MetamascaraPlatform, isPopup: getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_POPUP, rpcTarget: 'https://rawtestrpc.metamask.io/', identities: {}, diff --git a/ui/app/ducks/mock-gas-estimate-data.js b/ui/app/ducks/mock-gas-estimate-data.js deleted file mode 100644 index f2943df7ccf2..000000000000 --- a/ui/app/ducks/mock-gas-estimate-data.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - mockGasEstimateData: [{'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 6.2827225131, 'pct_remaining5m': 0.0, 'sum': 6.7965923077, 'tx_atabove': 3969.0, 'hashpower_accepting': 15.8974358974, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 1.0, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 7.1623036649, 'pct_remaining5m': 0.0, 'sum': 6.7841307692, 'tx_atabove': 3969.0, 'hashpower_accepting': 16.4102564103, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 1.3, 'pct_mined_5m': 0.0, 'total_seen_5m': 8.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 7.3403141361, 'pct_remaining5m': 0.0, 'sum': 6.7841307692, 'tx_atabove': 3969.0, 'hashpower_accepting': 16.4102564103, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 1.4, 'pct_mined_5m': 0.0, 'total_seen_5m': 13.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 7.3926701571, 'pct_remaining5m': 0.0, 'sum': 6.7841307692, 'tx_atabove': 3969.0, 'hashpower_accepting': 16.4102564103, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 1.5, 'pct_mined_5m': 0.0, 'total_seen_5m': 40.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 356.0, 'hashpower_accepting2': 7.5706806283, 'pct_remaining5m': 25.0, 'sum': 6.7769307692, 'tx_atabove': 3957.0, 'hashpower_accepting': 16.4102564103, 'hpa_coef2': -0.067, 'total_seen_30m': 33.0, 'int2': 6.9238, 'pct_remaining30m': 9.0, 'gasprice': 1.6, 'pct_mined_5m': 0.0, 'total_seen_5m': 346.0, 'pct_mined_30m': 6.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1048.5, 'hashpower_accepting2': 7.6020942408, 'pct_remaining5m': 95.0, 'sum': 6.0111923077, 'tx_atabove': 2930.0, 'hashpower_accepting': 22.5641025641, 'hpa_coef2': -0.067, 'total_seen_30m': 11.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 2.0, 'pct_mined_5m': 0.0, 'total_seen_5m': 23.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 56.0, 'hashpower_accepting2': 7.6020942408, 'pct_remaining5m': 99.0, 'sum': 5.2227923077, 'tx_atabove': 1616.0, 'hashpower_accepting': 22.5641025641, 'hpa_coef2': -0.067, 'total_seen_30m': 66.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 2.1, 'pct_mined_5m': 0.0, 'total_seen_5m': 131.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 41.0, 'hashpower_accepting2': 7.6020942408, 'pct_remaining5m': 100.0, 'sum': 4.8633923077, 'tx_atabove': 1017.0, 'hashpower_accepting': 22.5641025641, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 2.8, 'pct_mined_5m': 0.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 31.0, 'hashpower_accepting2': 7.612565445, 'pct_remaining5m': 100.0, 'sum': 4.8615923077, 'tx_atabove': 1014.0, 'hashpower_accepting': 22.5641025641, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 2.9, 'pct_mined_5m': 0.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 147.0, 'hashpower_accepting2': 12.3246073298, 'pct_remaining5m': 50.0, 'sum': 4.6965923077, 'tx_atabove': 1009.0, 'hashpower_accepting': 29.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 50.0, 'gasprice': 3.0, 'pct_mined_5m': 50.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 50.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 73.0, 'hashpower_accepting2': 12.3246073298, 'pct_remaining5m': 50.0, 'sum': 4.6437923077, 'tx_atabove': 921.0, 'hashpower_accepting': 29.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 3.1, 'pct_mined_5m': 0.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 93.0, 'hashpower_accepting2': 12.3246073298, 'pct_remaining5m': 100.0, 'sum': 4.6413923077, 'tx_atabove': 917.0, 'hashpower_accepting': 29.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 11.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 3.2, 'pct_mined_5m': 0.0, 'total_seen_5m': 8.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 44.5, 'hashpower_accepting2': 12.3246073298, 'pct_remaining5m': 100.0, 'sum': 4.6107923077, 'tx_atabove': 866.0, 'hashpower_accepting': 29.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 50.0, 'gasprice': 3.3, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 256.68, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 11.0, 'hashpower_accepting2': 12.3664921466, 'pct_remaining5m': 100.0, 'sum': 4.5893307692, 'tx_atabove': 851.0, 'hashpower_accepting': 29.7435897436, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 3.4, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 25.27, 'avgdiff': 0, 'expectedWait': 98.4285367101, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 31.0, 'hashpower_accepting2': 12.4712041885, 'pct_remaining5m': 100.0, 'sum': 4.5887307692, 'tx_atabove': 850.0, 'hashpower_accepting': 29.7435897436, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 3.5, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 25.25, 'avgdiff': 0, 'expectedWait': 98.3694973017, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 823.0, 'hashpower_accepting2': 12.4921465969, 'pct_remaining5m': 0.0, 'sum': 4.5428076923, 'tx_atabove': 815.0, 'hashpower_accepting': 30.7692307692, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 3.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 24.12, 'avgdiff': 0, 'expectedWait': 93.9542246928, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 35.0, 'hashpower_accepting2': 12.7539267016, 'pct_remaining5m': 10.0, 'sum': 4.5279461538, 'tx_atabove': 811.0, 'hashpower_accepting': 31.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 3.9, 'pct_mined_5m': 80.0, 'total_seen_5m': 10.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 23.76, 'avgdiff': 0, 'expectedWait': 92.5682447753, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 30.0, 'hashpower_accepting2': 15.4869109948, 'pct_remaining5m': 92.0, 'sum': 4.3896692308, 'tx_atabove': 809.0, 'hashpower_accepting': 36.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 16.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 4.0, 'pct_mined_5m': 5.0, 'total_seen_5m': 124.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 20.69, 'avgdiff': 0, 'expectedWait': 80.613750022, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 24.0, 'hashpower_accepting2': 16.7853403141, 'pct_remaining5m': 93.0, 'sum': 4.2840692308, 'tx_atabove': 633.0, 'hashpower_accepting': 36.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 20.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 4.1, 'pct_mined_5m': 6.0, 'total_seen_5m': 165.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 18.62, 'avgdiff': 0, 'expectedWait': 72.5350019424, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 126.0, 'hashpower_accepting2': 16.9005235602, 'pct_remaining5m': 50.0, 'sum': 4.1260846154, 'tx_atabove': 432.0, 'hashpower_accepting': 38.4615384615, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 4.3, 'pct_mined_5m': 0.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 15.9, 'avgdiff': 0, 'expectedWait': 61.9349484316, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 33.0, 'hashpower_accepting2': 17.1204188482, 'pct_remaining5m': 100.0, 'sum': 4.1140846154, 'tx_atabove': 412.0, 'hashpower_accepting': 38.4615384615, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 4.4, 'pct_mined_5m': 0.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 15.71, 'avgdiff': 0, 'expectedWait': 61.1961705828, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 24.0, 'hashpower_accepting2': 17.2460732984, 'pct_remaining5m': 100.0, 'sum': 4.1092846154, 'tx_atabove': 404.0, 'hashpower_accepting': 38.4615384615, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 4.6, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 15.63, 'avgdiff': 0, 'expectedWait': 60.9031328173, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 19.0, 'hashpower_accepting2': 17.4659685864, 'pct_remaining5m': 0.0, 'sum': 4.0570384615, 'tx_atabove': 400.0, 'hashpower_accepting': 40.5128205128, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 4.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 10.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 14.84, 'avgdiff': 0, 'expectedWait': 57.8028719141, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 3.0, 'hashpower_accepting2': 17.612565445, 'pct_remaining5m': 0.0, 'sum': 4.0403769231, 'tx_atabove': 393.0, 'hashpower_accepting': 41.0256410256, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 4.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 14.59, 'avgdiff': 0, 'expectedWait': 56.8477660026, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 31.0, 'hashpower_accepting2': 17.6439790576, 'pct_remaining5m': 100.0, 'sum': 4.0397769231, 'tx_atabove': 392.0, 'hashpower_accepting': 41.0256410256, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 4.9, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 14.58, 'avgdiff': 0, 'expectedWait': 56.8136675736, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 3.0, 'hashpower_accepting2': 20.502617801, 'pct_remaining5m': 3.0, 'sum': 2.2680615385, 'tx_atabove': 390.0, 'hashpower_accepting': 46.1538461538, 'hpa_coef2': -0.067, 'total_seen_30m': 43.0, 'int2': 6.9238, 'pct_remaining30m': 2.0, 'gasprice': 5.0, 'pct_mined_5m': 93.0, 'total_seen_5m': 66.0, 'pct_mined_30m': 97.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 2.48, 'avgdiff': 1, 'expectedWait': 9.660655842, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 20.5863874346, 'pct_remaining5m': 0.0, 'sum': 2.2308615385, 'tx_atabove': 328.0, 'hashpower_accepting': 46.1538461538, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 5.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 2.39, 'avgdiff': 1, 'expectedWait': 9.3078817242, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 20.7015706806, 'pct_remaining5m': 0.0, 'sum': 2.216, 'tx_atabove': 324.0, 'hashpower_accepting': 46.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 5.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 2.35, 'avgdiff': 1, 'expectedWait': 9.170575103, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 20.8481675393, 'pct_remaining5m': 0.0, 'sum': 2.1910769231, 'tx_atabove': 324.0, 'hashpower_accepting': 47.6923076923, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 5.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 5.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 2.3, 'avgdiff': 1, 'expectedWait': 8.9448408351, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 21.0261780105, 'pct_remaining5m': 0.0, 'sum': 2.1898769231, 'tx_atabove': 322.0, 'hashpower_accepting': 47.6923076923, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 5.4, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 2.29, 'avgdiff': 1, 'expectedWait': 8.9341134638, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 21.2041884817, 'pct_remaining5m': 0.0, 'sum': 2.1518923077, 'tx_atabove': 321.0, 'hashpower_accepting': 49.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 5.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 7.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 2.21, 'avgdiff': 1, 'expectedWait': 8.6011189709, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 21.277486911, 'pct_remaining5m': 0.0, 'sum': 2.1512923077, 'tx_atabove': 320.0, 'hashpower_accepting': 49.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 5.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 2.21, 'avgdiff': 1, 'expectedWait': 8.5959598474, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 21.3926701571, 'pct_remaining5m': 0.0, 'sum': 2.1494923077, 'tx_atabove': 317.0, 'hashpower_accepting': 49.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 5.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 2.2, 'avgdiff': 1, 'expectedWait': 8.5805010368, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 21.4136125654, 'pct_remaining5m': 0.0, 'sum': 2.1494923077, 'tx_atabove': 317.0, 'hashpower_accepting': 49.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 5.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 2.2, 'avgdiff': 1, 'expectedWait': 8.5805010368, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 25.5497382199, 'pct_remaining5m': 0.0, 'sum': 2.0124153846, 'tx_atabove': 317.0, 'hashpower_accepting': 54.8717948718, 'hpa_coef2': -0.067, 'total_seen_30m': 44.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 118.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.92, 'avgdiff': 1, 'expectedWait': 7.4813659176, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 25.5916230366, 'pct_remaining5m': 0.0, 'sum': 2.0010153846, 'tx_atabove': 298.0, 'hashpower_accepting': 54.8717948718, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.9, 'avgdiff': 1, 'expectedWait': 7.3965626432, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 25.7068062827, 'pct_remaining5m': 0.0, 'sum': 2.0004153846, 'tx_atabove': 297.0, 'hashpower_accepting': 54.8717948718, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.9, 'avgdiff': 1, 'expectedWait': 7.3921260367, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 25.8848167539, 'pct_remaining5m': 0.0, 'sum': 1.9986153846, 'tx_atabove': 294.0, 'hashpower_accepting': 54.8717948718, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 5.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.89, 'avgdiff': 1, 'expectedWait': 7.3788321779, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 25.8952879581, 'pct_remaining5m': 0.0, 'sum': 1.9986153846, 'tx_atabove': 294.0, 'hashpower_accepting': 54.8717948718, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 6.4, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.89, 'avgdiff': 1, 'expectedWait': 7.3788321779, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 25.9685863874, 'pct_remaining5m': 0.0, 'sum': 1.9986153846, 'tx_atabove': 294.0, 'hashpower_accepting': 54.8717948718, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.89, 'avgdiff': 1, 'expectedWait': 7.3788321779, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 26.3769633508, 'pct_remaining5m': 0.0, 'sum': 1.9612307692, 'tx_atabove': 294.0, 'hashpower_accepting': 56.4102564103, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 6.6, 'pct_mined_5m': 96.0, 'total_seen_5m': 29.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.82, 'avgdiff': 1, 'expectedWait': 7.1080700777, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 26.7120418848, 'pct_remaining5m': 0.0, 'sum': 1.9421692308, 'tx_atabove': 283.0, 'hashpower_accepting': 56.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.79, 'avgdiff': 1, 'expectedWait': 6.9738624916, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 26.9109947644, 'pct_remaining5m': 0.0, 'sum': 1.9421692308, 'tx_atabove': 283.0, 'hashpower_accepting': 56.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 9.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.79, 'avgdiff': 1, 'expectedWait': 6.9738624916, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 27.109947644, 'pct_remaining5m': 0.0, 'sum': 1.9415692308, 'tx_atabove': 282.0, 'hashpower_accepting': 56.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.79, 'avgdiff': 1, 'expectedWait': 6.9696794292, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 3.0, 'hashpower_accepting2': 29.2356020942, 'pct_remaining5m': 0.0, 'sum': 1.8294153846, 'tx_atabove': 282.0, 'hashpower_accepting': 61.5384615385, 'hpa_coef2': -0.067, 'total_seen_30m': 60.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 7.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 50.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.6, 'avgdiff': 1, 'expectedWait': 6.2302432976, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 29.780104712, 'pct_remaining5m': 0.0, 'sum': 1.8115538462, 'tx_atabove': 273.0, 'hashpower_accepting': 62.0512820513, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 7.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 18.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.57, 'avgdiff': 1, 'expectedWait': 6.1199495079, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 29.8848167539, 'pct_remaining5m': 0.0, 'sum': 1.8109538462, 'tx_atabove': 272.0, 'hashpower_accepting': 62.0512820513, 'hpa_coef2': -0.067, 'total_seen_30m': 4.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 7.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.57, 'avgdiff': 1, 'expectedWait': 6.1162786396, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 29.9476439791, 'pct_remaining5m': 0.0, 'sum': 1.8103538462, 'tx_atabove': 271.0, 'hashpower_accepting': 62.0512820513, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 7.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.57, 'avgdiff': 1, 'expectedWait': 6.1126099731, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 30.0209424084, 'pct_remaining5m': null, 'sum': 1.8085538462, 'tx_atabove': 268.0, 'hashpower_accepting': 62.0512820513, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 7.4, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.57, 'avgdiff': 1, 'expectedWait': 6.1016171717, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 30.1151832461, 'pct_remaining5m': 0.0, 'sum': 1.8085538462, 'tx_atabove': 268.0, 'hashpower_accepting': 62.0512820513, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 7.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.57, 'avgdiff': 1, 'expectedWait': 6.1016171717, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 30.2827225131, 'pct_remaining5m': 0.0, 'sum': 1.8085538462, 'tx_atabove': 268.0, 'hashpower_accepting': 62.0512820513, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 7.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.57, 'avgdiff': 1, 'expectedWait': 6.1016171717, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 30.8586387435, 'pct_remaining5m': 0.0, 'sum': 1.7681692308, 'tx_atabove': 263.0, 'hashpower_accepting': 63.5897435897, 'hpa_coef2': -0.067, 'total_seen_30m': 12.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 7.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.5, 'avgdiff': 1, 'expectedWait': 5.8601150164, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 30.9528795812, 'pct_remaining5m': 0.0, 'sum': 1.7681692308, 'tx_atabove': 263.0, 'hashpower_accepting': 63.5897435897, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 7.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.5, 'avgdiff': 1, 'expectedWait': 5.8601150164, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 31.3089005236, 'pct_remaining5m': 0.0, 'sum': 1.7432461538, 'tx_atabove': 263.0, 'hashpower_accepting': 64.6153846154, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 7.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.47, 'avgdiff': 1, 'expectedWait': 5.7158679264, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 33.2670157068, 'pct_remaining5m': 0.0, 'sum': 1.6928, 'tx_atabove': 262.0, 'hashpower_accepting': 66.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': 65.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 38.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.39, 'avgdiff': 1, 'expectedWait': 5.4346765153, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 33.4869109948, 'pct_remaining5m': 0.0, 'sum': 1.6624769231, 'tx_atabove': 253.0, 'hashpower_accepting': 67.6923076923, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.35, 'avgdiff': 1, 'expectedWait': 5.2723538995, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 34.2617801047, 'pct_remaining5m': null, 'sum': 1.6494153846, 'tx_atabove': 252.0, 'hashpower_accepting': 68.2051282051, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.2, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.34, 'avgdiff': 1, 'expectedWait': 5.2039366363, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 34.2827225131, 'pct_remaining5m': null, 'sum': 1.6494153846, 'tx_atabove': 252.0, 'hashpower_accepting': 68.2051282051, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.3, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.34, 'avgdiff': 1, 'expectedWait': 5.2039366363, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 35.2356020942, 'pct_remaining5m': 0.0, 'sum': 1.6244923077, 'tx_atabove': 252.0, 'hashpower_accepting': 69.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 33.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.3, 'avgdiff': 1, 'expectedWait': 5.0758414173, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 35.2984293194, 'pct_remaining5m': null, 'sum': 1.6244923077, 'tx_atabove': 252.0, 'hashpower_accepting': 69.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.6, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.3, 'avgdiff': 1, 'expectedWait': 5.0758414173, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 35.3612565445, 'pct_remaining5m': null, 'sum': 1.6244923077, 'tx_atabove': 252.0, 'hashpower_accepting': 69.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.8, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.3, 'avgdiff': 1, 'expectedWait': 5.0758414173, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 37.6335078534, 'pct_remaining5m': 0.0, 'sum': 1.5372615385, 'tx_atabove': 252.0, 'hashpower_accepting': 72.8205128205, 'hpa_coef2': -0.067, 'total_seen_30m': 35.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 91.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.19, 'avgdiff': 1, 'expectedWait': 4.6518339443, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 38.0209424084, 'pct_remaining5m': 0.0, 'sum': 1.5336615385, 'tx_atabove': 246.0, 'hashpower_accepting': 72.8205128205, 'hpa_coef2': -0.067, 'total_seen_30m': 14.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 7.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.19, 'avgdiff': 1, 'expectedWait': 4.6351174498, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 38.0732984293, 'pct_remaining5m': 0.0, 'sum': 1.5206, 'tx_atabove': 245.0, 'hashpower_accepting': 73.3333333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.17, 'avgdiff': 1, 'expectedWait': 4.5749693534, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 38.1151832461, 'pct_remaining5m': 0.0, 'sum': 1.5206, 'tx_atabove': 245.0, 'hashpower_accepting': 73.3333333333, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 9.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.17, 'avgdiff': 1, 'expectedWait': 4.5749693534, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 38.1465968586, 'pct_remaining5m': null, 'sum': 1.5206, 'tx_atabove': 245.0, 'hashpower_accepting': 73.3333333333, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.4, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.17, 'avgdiff': 1, 'expectedWait': 4.5749693534, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 38.2722513089, 'pct_remaining5m': null, 'sum': 1.52, 'tx_atabove': 244.0, 'hashpower_accepting': 73.3333333333, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.5, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.17, 'avgdiff': 1, 'expectedWait': 4.5722251951, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 38.6701570681, 'pct_remaining5m': null, 'sum': 1.5194, 'tx_atabove': 243.0, 'hashpower_accepting': 73.3333333333, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.6, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.17, 'avgdiff': 1, 'expectedWait': 4.5694826829, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 38.6910994764, 'pct_remaining5m': 0.0, 'sum': 1.5188, 'tx_atabove': 242.0, 'hashpower_accepting': 73.3333333333, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 9.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.17, 'avgdiff': 1, 'expectedWait': 4.5667418156, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 39.3403141361, 'pct_remaining5m': null, 'sum': 1.4979384615, 'tx_atabove': 228.0, 'hashpower_accepting': 73.8461538462, 'hpa_coef2': -0.067, 'total_seen_30m': 11.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.8, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.15, 'avgdiff': 1, 'expectedWait': 4.4724594129, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 39.7277486911, 'pct_remaining5m': 0.0, 'sum': 1.4979384615, 'tx_atabove': 228.0, 'hashpower_accepting': 73.8461538462, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 1.15, 'avgdiff': 1, 'expectedWait': 4.4724594129, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 44.2827225131, 'pct_remaining5m': 0.0, 'sum': 1.3472, 'tx_atabove': 226.0, 'hashpower_accepting': 80.0, 'hpa_coef2': -0.067, 'total_seen_30m': 126.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.0, 'pct_mined_5m': 98.0, 'total_seen_5m': 113.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.99, 'avgdiff': 1, 'expectedWait': 3.8466398462, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 44.4293193717, 'pct_remaining5m': 0.0, 'sum': 1.3448, 'tx_atabove': 222.0, 'hashpower_accepting': 80.0, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 5.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.99, 'avgdiff': 1, 'expectedWait': 3.8374189801, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 44.4921465969, 'pct_remaining5m': 0.0, 'sum': 1.3448, 'tx_atabove': 222.0, 'hashpower_accepting': 80.0, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.99, 'avgdiff': 1, 'expectedWait': 3.8374189801, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 44.502617801, 'pct_remaining5m': null, 'sum': 1.3448, 'tx_atabove': 222.0, 'hashpower_accepting': 80.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.3, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.99, 'avgdiff': 1, 'expectedWait': 3.8374189801, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 49.4240837696, 'pct_remaining5m': 0.0, 'sum': 1.2077230769, 'tx_atabove': 222.0, 'hashpower_accepting': 85.641025641, 'hpa_coef2': -0.067, 'total_seen_30m': 169.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 95.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.86, 'avgdiff': 1, 'expectedWait': 3.3458577122, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 49.4659685864, 'pct_remaining5m': 0.0, 'sum': 1.2077230769, 'tx_atabove': 222.0, 'hashpower_accepting': 85.641025641, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.86, 'avgdiff': 1, 'expectedWait': 3.3458577122, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 49.4869109948, 'pct_remaining5m': 0.0, 'sum': 1.2077230769, 'tx_atabove': 222.0, 'hashpower_accepting': 85.641025641, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 10.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.86, 'avgdiff': 1, 'expectedWait': 3.3458577122, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 49.6858638743, 'pct_remaining5m': 0.0, 'sum': 1.2077230769, 'tx_atabove': 222.0, 'hashpower_accepting': 85.641025641, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 10.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.86, 'avgdiff': 1, 'expectedWait': 3.3458577122, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 50.0628272251, 'pct_remaining5m': 0.0, 'sum': 1.2071230769, 'tx_atabove': 221.0, 'hashpower_accepting': 85.641025641, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 11.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.86, 'avgdiff': 1, 'expectedWait': 3.3438507997, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 56.1884816754, 'pct_remaining5m': 0.0, 'sum': 1.1358153846, 'tx_atabove': 206.0, 'hashpower_accepting': 88.2051282051, 'hpa_coef2': -0.067, 'total_seen_30m': 144.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 178.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.8, 'avgdiff': 1, 'expectedWait': 3.1137113805, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 56.7434554974, 'pct_remaining5m': 0.0, 'sum': 1.1280153846, 'tx_atabove': 193.0, 'hashpower_accepting': 88.2051282051, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 9.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.79, 'avgdiff': 1, 'expectedWait': 3.089518905, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 56.7748691099, 'pct_remaining5m': null, 'sum': 1.1280153846, 'tx_atabove': 193.0, 'hashpower_accepting': 88.2051282051, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.2, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.79, 'avgdiff': 1, 'expectedWait': 3.089518905, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 57.109947644, 'pct_remaining5m': 0.0, 'sum': 1.1280153846, 'tx_atabove': 193.0, 'hashpower_accepting': 88.2051282051, 'hpa_coef2': -0.067, 'total_seen_30m': 14.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.79, 'avgdiff': 1, 'expectedWait': 3.089518905, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 58.2931937173, 'pct_remaining5m': 0.0, 'sum': 1.1280153846, 'tx_atabove': 193.0, 'hashpower_accepting': 88.2051282051, 'hpa_coef2': -0.067, 'total_seen_30m': 10.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.79, 'avgdiff': 1, 'expectedWait': 3.089518905, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 58.3141361257, 'pct_remaining5m': null, 'sum': 1.1280153846, 'tx_atabove': 193.0, 'hashpower_accepting': 88.2051282051, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.7, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.79, 'avgdiff': 1, 'expectedWait': 3.089518905, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 58.3769633508, 'pct_remaining5m': 0.0, 'sum': 1.1280153846, 'tx_atabove': 193.0, 'hashpower_accepting': 88.2051282051, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.79, 'avgdiff': 1, 'expectedWait': 3.089518905, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 58.4293193717, 'pct_remaining5m': 0.0, 'sum': 1.1280153846, 'tx_atabove': 193.0, 'hashpower_accepting': 88.2051282051, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 11.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.79, 'avgdiff': 1, 'expectedWait': 3.089518905, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 60.7958115183, 'pct_remaining5m': 0.0, 'sum': 1.1030923077, 'tx_atabove': 193.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 50.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 87.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 3.0134702079, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 61.1413612565, 'pct_remaining5m': 0.0, 'sum': 1.1018923077, 'tx_atabove': 191.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 15.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 8.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 3.0098562125, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 61.1727748691, 'pct_remaining5m': 0.0, 'sum': 1.1018923077, 'tx_atabove': 191.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 12.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 3.0098562125, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 61.1832460733, 'pct_remaining5m': 0.0, 'sum': 1.1018923077, 'tx_atabove': 191.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 12.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 3.0098562125, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 61.1937172775, 'pct_remaining5m': 0.0, 'sum': 1.1018923077, 'tx_atabove': 191.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 12.4, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 3.0098562125, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 62.1989528796, 'pct_remaining5m': 0.0, 'sum': 1.1018923077, 'tx_atabove': 191.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 10.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 3.0098562125, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 62.3246073298, 'pct_remaining5m': 0.0, 'sum': 1.1006923077, 'tx_atabove': 189.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 12.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 9.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 3.0062465513, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 62.3560209424, 'pct_remaining5m': 0.0, 'sum': 1.1000923077, 'tx_atabove': 188.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 12.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 3.0044433444, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 62.7434554974, 'pct_remaining5m': 0.0, 'sum': 1.1000923077, 'tx_atabove': 188.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 11.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 9.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 3.0044433444, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 62.7643979058, 'pct_remaining5m': 0.0, 'sum': 1.1000923077, 'tx_atabove': 188.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 12.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 3.0044433444, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 65.5183246073, 'pct_remaining5m': 0.0, 'sum': 1.0988923077, 'tx_atabove': 186.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 43.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 22.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 3.0008401747, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 65.612565445, 'pct_remaining5m': 0.0, 'sum': 1.0988923077, 'tx_atabove': 186.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 3.0008401747, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 65.7277486911, 'pct_remaining5m': 0.0, 'sum': 1.0982923077, 'tx_atabove': 185.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 2.9990402106, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 65.7382198953, 'pct_remaining5m': null, 'sum': 1.0982923077, 'tx_atabove': 185.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.4, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 2.9990402106, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 67.1832460733, 'pct_remaining5m': 0.0, 'sum': 1.0982923077, 'tx_atabove': 185.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 18.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 11.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 2.9990402106, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 67.2041884817, 'pct_remaining5m': 0.0, 'sum': 1.0982923077, 'tx_atabove': 185.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 13.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 2.9990402106, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 67.3717277487, 'pct_remaining5m': null, 'sum': 1.0982923077, 'tx_atabove': 185.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.7, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 2.9990402106, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 67.3926701571, 'pct_remaining5m': 0.0, 'sum': 1.0982923077, 'tx_atabove': 185.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 13.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 2.9990402106, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 67.4136125654, 'pct_remaining5m': 0.0, 'sum': 1.0982923077, 'tx_atabove': 185.0, 'hashpower_accepting': 89.2307692308, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.77, 'avgdiff': 1, 'expectedWait': 2.9990402106, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 69.8219895288, 'pct_remaining5m': 0.0, 'sum': 1.0727692308, 'tx_atabove': 184.0, 'hashpower_accepting': 90.2564102564, 'hpa_coef2': -0.067, 'total_seen_30m': 25.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 14.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 59.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.75, 'avgdiff': 1, 'expectedWait': 2.9234640474, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.8743455497, 'pct_remaining5m': 0.0, 'sum': 1.0691692308, 'tx_atabove': 178.0, 'hashpower_accepting': 90.2564102564, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 14.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.75, 'avgdiff': 1, 'expectedWait': 2.9129584982, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.9057591623, 'pct_remaining5m': 0.0, 'sum': 1.0691692308, 'tx_atabove': 178.0, 'hashpower_accepting': 90.2564102564, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 14.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.75, 'avgdiff': 1, 'expectedWait': 2.9129584982, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.9581151832, 'pct_remaining5m': 0.0, 'sum': 1.0691692308, 'tx_atabove': 178.0, 'hashpower_accepting': 90.2564102564, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 14.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.75, 'avgdiff': 1, 'expectedWait': 2.9129584982, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 70.0104712042, 'pct_remaining5m': null, 'sum': 1.0691692308, 'tx_atabove': 178.0, 'hashpower_accepting': 90.2564102564, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 14.6, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.75, 'avgdiff': 1, 'expectedWait': 2.9129584982, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 70.1047120419, 'pct_remaining5m': 0.0, 'sum': 1.0691692308, 'tx_atabove': 178.0, 'hashpower_accepting': 90.2564102564, 'hpa_coef2': -0.067, 'total_seen_30m': 7.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 14.7, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.75, 'avgdiff': 1, 'expectedWait': 2.9129584982, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 72.7434554974, 'pct_remaining5m': 0.0, 'sum': 1.0442461538, 'tx_atabove': 178.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': 83.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 15.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 59.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.8412558463, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 72.7853403141, 'pct_remaining5m': 0.0, 'sum': 1.0400461538, 'tx_atabove': 171.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 15.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.8293475966, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 72.8062827225, 'pct_remaining5m': null, 'sum': 1.0400461538, 'tx_atabove': 171.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 15.4, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.8293475966, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 72.8586387435, 'pct_remaining5m': 0.0, 'sum': 1.0400461538, 'tx_atabove': 171.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 15.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.8293475966, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 73.3298429319, 'pct_remaining5m': 0.0, 'sum': 1.0400461538, 'tx_atabove': 171.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': 16.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 15.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 10.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.8293475966, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 73.3403141361, 'pct_remaining5m': 0.0, 'sum': 1.0400461538, 'tx_atabove': 171.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 15.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.8293475966, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 74.4397905759, 'pct_remaining5m': 0.0, 'sum': 1.0400461538, 'tx_atabove': 171.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': 36.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 16.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 28.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.8293475966, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 74.4502617801, 'pct_remaining5m': 0.0, 'sum': 1.0340461538, 'tx_atabove': 161.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 16.1, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.8124223376, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 74.4607329843, 'pct_remaining5m': 0.0, 'sum': 1.0340461538, 'tx_atabove': 161.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 16.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.8124223376, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 74.502617801, 'pct_remaining5m': 0.0, 'sum': 1.0340461538, 'tx_atabove': 161.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 16.3, 'pct_mined_5m': 50.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.8124223376, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 74.6806282723, 'pct_remaining5m': 0.0, 'sum': 1.0334461538, 'tx_atabove': 160.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 16.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 9.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.8107353903, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 74.7120418848, 'pct_remaining5m': 0.0, 'sum': 1.0334461538, 'tx_atabove': 160.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 16.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.8107353903, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 74.7434554974, 'pct_remaining5m': null, 'sum': 1.0334461538, 'tx_atabove': 160.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 16.8, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.8107353903, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.0785340314, 'pct_remaining5m': 0.0, 'sum': 1.0334461538, 'tx_atabove': 160.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': 17.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 17.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 5.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.8107353903, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.1204188482, 'pct_remaining5m': 0.0, 'sum': 1.0334461538, 'tx_atabove': 160.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 17.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.8107353903, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.1413612565, 'pct_remaining5m': 0.0, 'sum': 1.0334461538, 'tx_atabove': 160.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 17.7, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.8107353903, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.1518324607, 'pct_remaining5m': null, 'sum': 1.0334461538, 'tx_atabove': 160.0, 'hashpower_accepting': 91.2820512821, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 17.8, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.8107353903, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.4764397906, 'pct_remaining5m': 0.0, 'sum': 1.0209846154, 'tx_atabove': 160.0, 'hashpower_accepting': 91.7948717949, 'hpa_coef2': -0.067, 'total_seen_30m': 14.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 18.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.7759266389, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.5183246073, 'pct_remaining5m': 0.0, 'sum': 1.0209846154, 'tx_atabove': 160.0, 'hashpower_accepting': 91.7948717949, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 18.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.7759266389, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.5287958115, 'pct_remaining5m': null, 'sum': 1.0209846154, 'tx_atabove': 160.0, 'hashpower_accepting': 91.7948717949, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 18.3, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.7759266389, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.5497382199, 'pct_remaining5m': 0.0, 'sum': 1.0209846154, 'tx_atabove': 160.0, 'hashpower_accepting': 91.7948717949, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 18.4, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.7759266389, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.5811518325, 'pct_remaining5m': null, 'sum': 1.0209846154, 'tx_atabove': 160.0, 'hashpower_accepting': 91.7948717949, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 18.9, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.7759266389, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.6230366492, 'pct_remaining5m': 0.0, 'sum': 1.0209846154, 'tx_atabove': 160.0, 'hashpower_accepting': 91.7948717949, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 19.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.7759266389, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.6753926702, 'pct_remaining5m': 0.0, 'sum': 1.0203846154, 'tx_atabove': 159.0, 'hashpower_accepting': 91.7948717949, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 19.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.7742615825, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.7068062827, 'pct_remaining5m': 0.0, 'sum': 1.0197846154, 'tx_atabove': 158.0, 'hashpower_accepting': 91.7948717949, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 19.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.7725975248, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.7172774869, 'pct_remaining5m': 0.0, 'sum': 1.0197846154, 'tx_atabove': 158.0, 'hashpower_accepting': 91.7948717949, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 19.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.7725975248, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 76.1570680628, 'pct_remaining5m': 0.0, 'sum': 1.0197846154, 'tx_atabove': 158.0, 'hashpower_accepting': 91.7948717949, 'hpa_coef2': -0.067, 'total_seen_30m': 16.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 19.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 12.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.7725975248, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 80.335078534, 'pct_remaining5m': 0.0, 'sum': 0.9076307692, 'tx_atabove': 158.0, 'hashpower_accepting': 96.4102564103, 'hpa_coef2': -0.067, 'total_seen_30m': 109.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 20.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 132.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.64, 'avgdiff': 1, 'expectedWait': 2.4784435671, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 80.3455497382, 'pct_remaining5m': 0.0, 'sum': 0.8446307692, 'tx_atabove': 53.0, 'hashpower_accepting': 96.4102564103, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 20.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.6, 'avgdiff': 1, 'expectedWait': 2.3271184122, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 80.3769633508, 'pct_remaining5m': 0.0, 'sum': 0.8446307692, 'tx_atabove': 53.0, 'hashpower_accepting': 96.4102564103, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 20.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.6, 'avgdiff': 1, 'expectedWait': 2.3271184122, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 80.3979057592, 'pct_remaining5m': 0.0, 'sum': 0.8446307692, 'tx_atabove': 53.0, 'hashpower_accepting': 96.4102564103, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 20.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.6, 'avgdiff': 1, 'expectedWait': 2.3271184122, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 82.6596858639, 'pct_remaining5m': 0.0, 'sum': 0.8321692308, 'tx_atabove': 53.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 37.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 21.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 30.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2982988774, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 82.8586387435, 'pct_remaining5m': null, 'sum': 0.8303692308, 'tx_atabove': 50.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 21.1, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2941656605, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 82.9005235602, 'pct_remaining5m': 0.0, 'sum': 0.8297692308, 'tx_atabove': 49.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 21.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2927895739, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 82.9633507853, 'pct_remaining5m': 0.0, 'sum': 0.8297692308, 'tx_atabove': 49.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 21.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2927895739, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 82.9738219895, 'pct_remaining5m': null, 'sum': 0.8297692308, 'tx_atabove': 49.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 21.7, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2927895739, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 82.9947643979, 'pct_remaining5m': null, 'sum': 0.8297692308, 'tx_atabove': 49.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 21.9, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2927895739, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 83.2041884817, 'pct_remaining5m': 0.0, 'sum': 0.8297692308, 'tx_atabove': 49.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 4.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 22.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 7.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2927895739, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 83.2565445026, 'pct_remaining5m': null, 'sum': 0.8291692308, 'tx_atabove': 48.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 22.6, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2914143128, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 83.2670157068, 'pct_remaining5m': null, 'sum': 0.8291692308, 'tx_atabove': 48.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 22.8, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2914143128, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 83.9895287958, 'pct_remaining5m': 0.0, 'sum': 0.8291692308, 'tx_atabove': 48.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 28.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 23.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 15.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2914143128, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.0523560209, 'pct_remaining5m': null, 'sum': 0.8285692308, 'tx_atabove': 47.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 23.1, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2900398766, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.0628272251, 'pct_remaining5m': 0.0, 'sum': 0.8285692308, 'tx_atabove': 47.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 23.4, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2900398766, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.0837696335, 'pct_remaining5m': null, 'sum': 0.8285692308, 'tx_atabove': 47.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 23.5, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2900398766, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.1570680628, 'pct_remaining5m': 0.0, 'sum': 0.8285692308, 'tx_atabove': 47.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 24.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2900398766, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.167539267, 'pct_remaining5m': null, 'sum': 0.8285692308, 'tx_atabove': 47.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 24.2, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2900398766, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.1780104712, 'pct_remaining5m': null, 'sum': 0.8285692308, 'tx_atabove': 47.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 24.3, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2900398766, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.1884816754, 'pct_remaining5m': 0.0, 'sum': 0.8285692308, 'tx_atabove': 47.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 24.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2900398766, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.3664921466, 'pct_remaining5m': 0.0, 'sum': 0.8285692308, 'tx_atabove': 47.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 25.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2900398766, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.502617801, 'pct_remaining5m': 0.0, 'sum': 0.8285692308, 'tx_atabove': 47.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 26.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2900398766, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.5340314136, 'pct_remaining5m': null, 'sum': 0.8285692308, 'tx_atabove': 47.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 27.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2900398766, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.7120418848, 'pct_remaining5m': 0.0, 'sum': 0.8279692308, 'tx_atabove': 46.0, 'hashpower_accepting': 96.9230769231, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 28.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.2886662648, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.9633507853, 'pct_remaining5m': 0.0, 'sum': 0.8155076923, 'tx_atabove': 46.0, 'hashpower_accepting': 97.4358974359, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 29.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 9.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.58, 'avgdiff': 1, 'expectedWait': 2.2603229297, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 85.664921466, 'pct_remaining5m': 0.0, 'sum': 0.8143076923, 'tx_atabove': 44.0, 'hashpower_accepting': 97.4358974359, 'hpa_coef2': -0.067, 'total_seen_30m': 17.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 30.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 26.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.58, 'avgdiff': 1, 'expectedWait': 2.2576121689, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 85.7696335079, 'pct_remaining5m': 0.0, 'sum': 0.8143076923, 'tx_atabove': 44.0, 'hashpower_accepting': 97.4358974359, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 31.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.58, 'avgdiff': 1, 'expectedWait': 2.2576121689, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.0628272251, 'pct_remaining5m': 0.0, 'sum': 0.7893846154, 'tx_atabove': 44.0, 'hashpower_accepting': 98.4615384615, 'hpa_coef2': -0.067, 'total_seen_30m': 14.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 32.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.57, 'avgdiff': 1, 'expectedWait': 2.2020409071, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.2617801047, 'pct_remaining5m': 0.0, 'sum': 0.7887846154, 'tx_atabove': 43.0, 'hashpower_accepting': 98.4615384615, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 33.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.56, 'avgdiff': 1, 'expectedWait': 2.2007200789, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.3560209424, 'pct_remaining5m': 0.0, 'sum': 0.7887846154, 'tx_atabove': 43.0, 'hashpower_accepting': 98.4615384615, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 34.0, 'pct_mined_5m': 50.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.56, 'avgdiff': 1, 'expectedWait': 2.2007200789, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.5235602094, 'pct_remaining5m': 0.0, 'sum': 0.7887846154, 'tx_atabove': 43.0, 'hashpower_accepting': 98.4615384615, 'hpa_coef2': -0.067, 'total_seen_30m': 7.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 35.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.56, 'avgdiff': 1, 'expectedWait': 2.2007200789, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.5654450262, 'pct_remaining5m': 0.0, 'sum': 0.7881846154, 'tx_atabove': 42.0, 'hashpower_accepting': 98.4615384615, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 36.0, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.56, 'avgdiff': 1, 'expectedWait': 2.1994000429, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.5863874346, 'pct_remaining5m': null, 'sum': 0.7881846154, 'tx_atabove': 42.0, 'hashpower_accepting': 98.4615384615, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 37.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.56, 'avgdiff': 1, 'expectedWait': 2.1994000429, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.6178010471, 'pct_remaining5m': 0.0, 'sum': 0.7881846154, 'tx_atabove': 42.0, 'hashpower_accepting': 98.4615384615, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 38.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.56, 'avgdiff': 1, 'expectedWait': 2.1994000429, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.6701570681, 'pct_remaining5m': null, 'sum': 0.7881846154, 'tx_atabove': 42.0, 'hashpower_accepting': 98.4615384615, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 39.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.56, 'avgdiff': 1, 'expectedWait': 2.1994000429, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 87.3612565445, 'pct_remaining5m': 0.0, 'sum': 0.7757230769, 'tx_atabove': 42.0, 'hashpower_accepting': 98.9743589744, 'hpa_coef2': -0.067, 'total_seen_30m': 13.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 40.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 19.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.56, 'avgdiff': 1, 'expectedWait': 2.1721621998, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 89.8115183246, 'pct_remaining5m': 0.0, 'sum': 0.7751230769, 'tx_atabove': 41.0, 'hashpower_accepting': 98.9743589744, 'hpa_coef2': -0.067, 'total_seen_30m': 65.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 41.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 84.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.56, 'avgdiff': 1, 'expectedWait': 2.1708592934, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 90.3141361257, 'pct_remaining5m': 0.0, 'sum': 0.7709230769, 'tx_atabove': 34.0, 'hashpower_accepting': 98.9743589744, 'hpa_coef2': -0.067, 'total_seen_30m': 13.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 42.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 16.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.55, 'avgdiff': 1, 'expectedWait': 2.1617608046, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 90.3455497382, 'pct_remaining5m': 0.0, 'sum': 0.7697230769, 'tx_atabove': 32.0, 'hashpower_accepting': 98.9743589744, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 43.0, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.55, 'avgdiff': 1, 'expectedWait': 2.1591682475, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 90.3769633508, 'pct_remaining5m': 0.0, 'sum': 0.7697230769, 'tx_atabove': 32.0, 'hashpower_accepting': 98.9743589744, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 44.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.55, 'avgdiff': 1, 'expectedWait': 2.1591682475, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 92.0314136126, 'pct_remaining5m': 0.0, 'sum': 0.7697230769, 'tx_atabove': 32.0, 'hashpower_accepting': 98.9743589744, 'hpa_coef2': -0.067, 'total_seen_30m': 19.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 45.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 28.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.55, 'avgdiff': 1, 'expectedWait': 2.1591682475, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 92.0628272251, 'pct_remaining5m': 0.0, 'sum': 0.7691230769, 'tx_atabove': 31.0, 'hashpower_accepting': 98.9743589744, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 46.0, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.55, 'avgdiff': 1, 'expectedWait': 2.1578731351, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 92.1047120419, 'pct_remaining5m': 0.0, 'sum': 0.7691230769, 'tx_atabove': 31.0, 'hashpower_accepting': 98.9743589744, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 47.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.55, 'avgdiff': 1, 'expectedWait': 2.1578731351, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 92.1570680628, 'pct_remaining5m': 0.0, 'sum': 0.7685230769, 'tx_atabove': 30.0, 'hashpower_accepting': 98.9743589744, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 48.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.55, 'avgdiff': 1, 'expectedWait': 2.1565787996, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 92.1884816754, 'pct_remaining5m': 0.0, 'sum': 0.7685230769, 'tx_atabove': 30.0, 'hashpower_accepting': 98.9743589744, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 49.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.55, 'avgdiff': 1, 'expectedWait': 2.1565787996, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 95.5287958115, 'pct_remaining5m': 0.0, 'sum': 0.7436, 'tx_atabove': 30.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 87.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 50.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 54.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.54, 'avgdiff': 1, 'expectedWait': 2.1034944803, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 95.7172774869, 'pct_remaining5m': 0.0, 'sum': 0.734, 'tx_atabove': 14.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 51.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 9.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0833975529, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 95.9057591623, 'pct_remaining5m': 0.0, 'sum': 0.734, 'tx_atabove': 14.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 52.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 5.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0833975529, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 95.9371727749, 'pct_remaining5m': 0.0, 'sum': 0.7316, 'tx_atabove': 10.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 54.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0784033942, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 95.9895287958, 'pct_remaining5m': null, 'sum': 0.7316, 'tx_atabove': 10.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 55.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0784033942, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 96.0418848168, 'pct_remaining5m': 0.0, 'sum': 0.7316, 'tx_atabove': 10.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 57.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0784033942, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 96.0523560209, 'pct_remaining5m': null, 'sum': 0.7316, 'tx_atabove': 10.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 58.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0784033942, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 96.0628272251, 'pct_remaining5m': 0.0, 'sum': 0.7316, 'tx_atabove': 10.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 59.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0784033942, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 96.4083769634, 'pct_remaining5m': 0.0, 'sum': 0.7316, 'tx_atabove': 10.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 60.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 13.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0784033942, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 97.445026178, 'pct_remaining5m': 0.0, 'sum': 0.7298, 'tx_atabove': 7.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 21.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 61.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 14.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0746656331, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.1570680628, 'pct_remaining5m': 0.0, 'sum': 0.7292, 'tx_atabove': 6.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 12.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 63.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 15.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.073421207, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.3979057592, 'pct_remaining5m': 0.0, 'sum': 0.7286, 'tx_atabove': 5.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 7.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 64.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0721775275, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.4293193717, 'pct_remaining5m': 0.0, 'sum': 0.7286, 'tx_atabove': 5.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 65.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0721775275, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.6492146597, 'pct_remaining5m': 0.0, 'sum': 0.7286, 'tx_atabove': 5.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 66.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0721775275, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.6701570681, 'pct_remaining5m': 0.0, 'sum': 0.7286, 'tx_atabove': 5.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 67.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0721775275, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.6806282723, 'pct_remaining5m': null, 'sum': 0.728, 'tx_atabove': 4.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 68.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0709345939, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.7120418848, 'pct_remaining5m': 0.0, 'sum': 0.728, 'tx_atabove': 4.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 70.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0709345939, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.7958115183, 'pct_remaining5m': 0.0, 'sum': 0.728, 'tx_atabove': 4.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 71.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0709345939, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.8376963351, 'pct_remaining5m': 0.0, 'sum': 0.728, 'tx_atabove': 4.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 77.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0709345939, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.0261780105, 'pct_remaining5m': 0.0, 'sum': 0.728, 'tx_atabove': 4.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 80.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 9.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0709345939, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.0471204188, 'pct_remaining5m': null, 'sum': 0.728, 'tx_atabove': 4.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 81.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0709345939, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.057591623, 'pct_remaining5m': 0.0, 'sum': 0.728, 'tx_atabove': 4.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 85.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0709345939, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.0680628272, 'pct_remaining5m': null, 'sum': 0.728, 'tx_atabove': 4.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 86.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0709345939, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.1937172775, 'pct_remaining5m': 0.0, 'sum': 0.728, 'tx_atabove': 4.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 88.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0709345939, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.3717277487, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 90.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.4031413613, 'pct_remaining5m': null, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 91.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.4136125654, 'pct_remaining5m': null, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 94.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.4240837696, 'pct_remaining5m': null, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 98.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.5287958115, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 99.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.780104712, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 100.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.7905759162, 'pct_remaining5m': 0.0, 'sum': 0.7262, 'tx_atabove': 1.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 101.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0672102645, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.8848167539, 'pct_remaining5m': 0.0, 'sum': 0.7262, 'tx_atabove': 1.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 102.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0672102645, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.8952879581, 'pct_remaining5m': 0.0, 'sum': 0.7262, 'tx_atabove': 1.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 120.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0672102645, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.9371727749, 'pct_remaining5m': 0.0, 'sum': 0.7262, 'tx_atabove': 1.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 122.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0672102645, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.9790575916, 'pct_remaining5m': null, 'sum': 0.7256, 'tx_atabove': 0.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 134.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0659703104, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 100.0, 'pct_remaining5m': 0.0, 'sum': 0.7256, 'tx_atabove': 0.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 180.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 500, 'safelow': 500, 'nomine': 330, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0659703104, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}], -} diff --git a/ui/app/ducks/tests/send-duck.test.js b/ui/app/ducks/send/send-duck.test.js similarity index 99% rename from ui/app/ducks/tests/send-duck.test.js rename to ui/app/ducks/send/send-duck.test.js index 43f51c631410..92c8dffd8d5c 100644 --- a/ui/app/ducks/tests/send-duck.test.js +++ b/ui/app/ducks/send/send-duck.test.js @@ -7,7 +7,7 @@ import SendReducer, { showGasButtonGroup, hideGasButtonGroup, updateSendWarnings, -} from '../send.duck.js' +} from './send.duck.js' describe('Send Duck', () => { const mockState = { diff --git a/ui/app/ducks/send.duck.js b/ui/app/ducks/send/send.duck.js similarity index 100% rename from ui/app/ducks/send.duck.js rename to ui/app/ducks/send/send.duck.js diff --git a/ui/app/constants/common.js b/ui/app/helpers/constants/common.js similarity index 76% rename from ui/app/constants/common.js rename to ui/app/helpers/constants/common.js index c6e566b8b573..58fae5e5f979 100644 --- a/ui/app/constants/common.js +++ b/ui/app/helpers/constants/common.js @@ -6,5 +6,8 @@ export const PRIMARY = 'PRIMARY' export const SECONDARY = 'SECONDARY' export const NETWORK_TYPES = { + KOVAN: 'kovan', MAINNET: 'mainnet', + RINKEBY: 'rinkeby', + ROPSTEN: 'ropsten', } diff --git a/ui/app/constants/error-keys.js b/ui/app/helpers/constants/error-keys.js similarity index 100% rename from ui/app/constants/error-keys.js rename to ui/app/helpers/constants/error-keys.js diff --git a/ui/app/infura-conversion.json b/ui/app/helpers/constants/infura-conversion.json similarity index 100% rename from ui/app/infura-conversion.json rename to ui/app/helpers/constants/infura-conversion.json diff --git a/ui/app/routes.js b/ui/app/helpers/constants/routes.js similarity index 90% rename from ui/app/routes.js rename to ui/app/helpers/constants/routes.js index 932dfa7df2e9..c15027ff4002 100644 --- a/ui/app/routes.js +++ b/ui/app/helpers/constants/routes.js @@ -2,7 +2,12 @@ const DEFAULT_ROUTE = '/' const UNLOCK_ROUTE = '/unlock' const LOCK_ROUTE = '/lock' const SETTINGS_ROUTE = '/settings' +const GENERAL_ROUTE = '/settings/general' const INFO_ROUTE = '/settings/info' +const ADVANCED_ROUTE = '/settings/advanced' +const SECURITY_ROUTE = '/settings/security' +const COMPANY_ROUTE = '/settings/company' +const ABOUT_US_ROUTE = '/settings/about-us' const REVEAL_SEED_ROUTE = '/seed' const MOBILE_SYNC_ROUTE = '/mobile-sync' const CONFIRM_SEED_ROUTE = '/confirm-seed' @@ -80,4 +85,9 @@ module.exports = { CONFIRM_TOKEN_METHOD_PATH, SIGNATURE_REQUEST_PATH, INITIALIZE_METAMETRICS_OPT_IN_ROUTE, + ADVANCED_ROUTE, + SECURITY_ROUTE, + COMPANY_ROUTE, + GENERAL_ROUTE, + ABOUT_US_ROUTE, } diff --git a/ui/app/constants/transactions.js b/ui/app/helpers/constants/transactions.js similarity index 100% rename from ui/app/constants/transactions.js rename to ui/app/helpers/constants/transactions.js diff --git a/ui/app/higher-order-components/authenticated/authenticated.component.js b/ui/app/helpers/higher-order-components/authenticated/authenticated.component.js similarity index 88% rename from ui/app/higher-order-components/authenticated/authenticated.component.js rename to ui/app/helpers/higher-order-components/authenticated/authenticated.component.js index 7b64d4895ed4..c195d0e21a52 100644 --- a/ui/app/higher-order-components/authenticated/authenticated.component.js +++ b/ui/app/helpers/higher-order-components/authenticated/authenticated.component.js @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' import { Redirect, Route } from 'react-router-dom' -import { UNLOCK_ROUTE, INITIALIZE_ROUTE } from '../../routes' +import { UNLOCK_ROUTE, INITIALIZE_ROUTE } from '../../constants/routes' export default function Authenticated (props) { const { isUnlocked, completedOnboarding } = props diff --git a/ui/app/higher-order-components/authenticated/authenticated.container.js b/ui/app/helpers/higher-order-components/authenticated/authenticated.container.js similarity index 100% rename from ui/app/higher-order-components/authenticated/authenticated.container.js rename to ui/app/helpers/higher-order-components/authenticated/authenticated.container.js diff --git a/ui/app/higher-order-components/authenticated/index.js b/ui/app/helpers/higher-order-components/authenticated/index.js similarity index 100% rename from ui/app/higher-order-components/authenticated/index.js rename to ui/app/helpers/higher-order-components/authenticated/index.js diff --git a/ui/app/i18n-provider.js b/ui/app/helpers/higher-order-components/i18n-provider.js similarity index 96% rename from ui/app/i18n-provider.js rename to ui/app/helpers/higher-order-components/i18n-provider.js index 3419474c4c2e..0e34e17e011d 100644 --- a/ui/app/i18n-provider.js +++ b/ui/app/helpers/higher-order-components/i18n-provider.js @@ -3,7 +3,7 @@ const connect = require('react-redux').connect const PropTypes = require('prop-types') const { withRouter } = require('react-router-dom') const { compose } = require('recompose') -const t = require('../i18n-helper').getMessage +const t = require('../utils/i18n-helper').getMessage class I18nProvider extends Component { tOrDefault = (key, defaultValue, ...args) => { diff --git a/ui/app/higher-order-components/initialized/index.js b/ui/app/helpers/higher-order-components/initialized/index.js similarity index 100% rename from ui/app/higher-order-components/initialized/index.js rename to ui/app/helpers/higher-order-components/initialized/index.js diff --git a/ui/app/higher-order-components/initialized/initialized.component.js b/ui/app/helpers/higher-order-components/initialized/initialized.component.js similarity index 85% rename from ui/app/higher-order-components/initialized/initialized.component.js rename to ui/app/helpers/higher-order-components/initialized/initialized.component.js index 0736ceff4750..2042c0046877 100644 --- a/ui/app/higher-order-components/initialized/initialized.component.js +++ b/ui/app/helpers/higher-order-components/initialized/initialized.component.js @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' import { Redirect, Route } from 'react-router-dom' -import { INITIALIZE_ROUTE } from '../../routes' +import { INITIALIZE_ROUTE } from '../../constants/routes' export default function Initialized (props) { return props.completedOnboarding diff --git a/ui/app/higher-order-components/initialized/initialized.container.js b/ui/app/helpers/higher-order-components/initialized/initialized.container.js similarity index 100% rename from ui/app/higher-order-components/initialized/initialized.container.js rename to ui/app/helpers/higher-order-components/initialized/initialized.container.js diff --git a/ui/app/metametrics/metametrics.provider.js b/ui/app/helpers/higher-order-components/metametrics/metametrics.provider.js similarity index 93% rename from ui/app/metametrics/metametrics.provider.js rename to ui/app/helpers/higher-order-components/metametrics/metametrics.provider.js index 5ff0294e51ec..6086e03fb678 100644 --- a/ui/app/metametrics/metametrics.provider.js +++ b/ui/app/helpers/higher-order-components/metametrics/metametrics.provider.js @@ -9,15 +9,15 @@ import { getAccountType, getNumberOfAccounts, getNumberOfTokens, -} from '../selectors' +} from '../../../selectors/selectors' import { txDataSelector, -} from '../selectors/confirm-transaction' -import { getEnvironmentType } from '../../../app/scripts/lib/util' +} from '../../../selectors/confirm-transaction' +import { getEnvironmentType } from '../../../../../app/scripts/lib/util' import { sendMetaMetricsEvent, sendCountIsTrackable, -} from './metametrics.util' +} from '../../utils/metametrics.util' class MetaMetricsProvider extends Component { static propTypes = { diff --git a/ui/app/higher-order-components/with-method-data/index.js b/ui/app/helpers/higher-order-components/with-method-data/index.js similarity index 100% rename from ui/app/higher-order-components/with-method-data/index.js rename to ui/app/helpers/higher-order-components/with-method-data/index.js diff --git a/ui/app/higher-order-components/with-method-data/with-method-data.component.js b/ui/app/helpers/higher-order-components/with-method-data/with-method-data.component.js similarity index 95% rename from ui/app/higher-order-components/with-method-data/with-method-data.component.js rename to ui/app/helpers/higher-order-components/with-method-data/with-method-data.component.js index 08b9083e14c2..efa9ad0a2345 100644 --- a/ui/app/higher-order-components/with-method-data/with-method-data.component.js +++ b/ui/app/helpers/higher-order-components/with-method-data/with-method-data.component.js @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import { getMethodData, getFourBytePrefix } from '../../helpers/transactions.util' +import { getMethodData, getFourBytePrefix } from '../../utils/transactions.util' export default function withMethodData (WrappedComponent) { return class MethodDataWrappedComponent extends PureComponent { diff --git a/ui/app/higher-order-components/with-modal-props/index.js b/ui/app/helpers/higher-order-components/with-modal-props/index.js similarity index 100% rename from ui/app/higher-order-components/with-modal-props/index.js rename to ui/app/helpers/higher-order-components/with-modal-props/index.js diff --git a/ui/app/higher-order-components/with-modal-props/tests/with-modal-props.test.js b/ui/app/helpers/higher-order-components/with-modal-props/tests/with-modal-props.test.js similarity index 100% rename from ui/app/higher-order-components/with-modal-props/tests/with-modal-props.test.js rename to ui/app/helpers/higher-order-components/with-modal-props/tests/with-modal-props.test.js diff --git a/ui/app/higher-order-components/with-modal-props/with-modal-props.js b/ui/app/helpers/higher-order-components/with-modal-props/with-modal-props.js similarity index 89% rename from ui/app/higher-order-components/with-modal-props/with-modal-props.js rename to ui/app/helpers/higher-order-components/with-modal-props/with-modal-props.js index 02f3855af41e..aac6b5a61669 100644 --- a/ui/app/higher-order-components/with-modal-props/with-modal-props.js +++ b/ui/app/helpers/higher-order-components/with-modal-props/with-modal-props.js @@ -1,5 +1,5 @@ import { connect } from 'react-redux' -import { hideModal } from '../../actions' +import { hideModal } from '../../../store/actions' const mapStateToProps = state => { const { appState } = state diff --git a/ui/app/higher-order-components/with-token-tracker/index.js b/ui/app/helpers/higher-order-components/with-token-tracker/index.js similarity index 100% rename from ui/app/higher-order-components/with-token-tracker/index.js rename to ui/app/helpers/higher-order-components/with-token-tracker/index.js diff --git a/ui/app/higher-order-components/with-token-tracker/with-token-tracker.component.js b/ui/app/helpers/higher-order-components/with-token-tracker/with-token-tracker.component.js similarity index 100% rename from ui/app/higher-order-components/with-token-tracker/with-token-tracker.component.js rename to ui/app/helpers/higher-order-components/with-token-tracker/with-token-tracker.component.js diff --git a/ui/app/helpers/common.util.js b/ui/app/helpers/utils/common.util.js similarity index 100% rename from ui/app/helpers/common.util.js rename to ui/app/helpers/utils/common.util.js diff --git a/ui/app/helpers/tests/common.util.test.js b/ui/app/helpers/utils/common.util.test.js similarity index 93% rename from ui/app/helpers/tests/common.util.test.js rename to ui/app/helpers/utils/common.util.test.js index a52b91a1097b..6259f4a891d3 100644 --- a/ui/app/helpers/tests/common.util.test.js +++ b/ui/app/helpers/utils/common.util.test.js @@ -1,4 +1,4 @@ -import * as utils from '../common.util' +import * as utils from './common.util' import assert from 'assert' describe('Common utils', () => { diff --git a/ui/app/helpers/confirm-transaction/util.js b/ui/app/helpers/utils/confirm-tx.util.js similarity index 99% rename from ui/app/helpers/confirm-transaction/util.js rename to ui/app/helpers/utils/confirm-tx.util.js index 0451824e8bfa..f843db11827c 100644 --- a/ui/app/helpers/confirm-transaction/util.js +++ b/ui/app/helpers/utils/confirm-tx.util.js @@ -8,7 +8,7 @@ import { addCurrencies, multiplyCurrencies, conversionGreaterThan, -} from '../../conversion-util' +} from './conversion-util' import { unconfirmedTransactionsCountSelector } from '../../selectors/confirm-transaction' diff --git a/ui/app/helpers/confirm-transaction/util.test.js b/ui/app/helpers/utils/confirm-tx.util.test.js similarity index 98% rename from ui/app/helpers/confirm-transaction/util.test.js rename to ui/app/helpers/utils/confirm-tx.util.test.js index 4c1a3e16b50d..e818601ca8f5 100644 --- a/ui/app/helpers/confirm-transaction/util.test.js +++ b/ui/app/helpers/utils/confirm-tx.util.test.js @@ -1,4 +1,4 @@ -import * as utils from './util' +import * as utils from './confirm-tx.util' import assert from 'assert' describe('Confirm Transaction utils', () => { diff --git a/ui/app/conversion-util.js b/ui/app/helpers/utils/conversion-util.js similarity index 100% rename from ui/app/conversion-util.js rename to ui/app/helpers/utils/conversion-util.js diff --git a/ui/app/conversion-util.test.js b/ui/app/helpers/utils/conversion-util.test.js similarity index 100% rename from ui/app/conversion-util.test.js rename to ui/app/helpers/utils/conversion-util.test.js diff --git a/ui/app/helpers/conversions.util.js b/ui/app/helpers/utils/conversions.util.js similarity index 97% rename from ui/app/helpers/conversions.util.js rename to ui/app/helpers/utils/conversions.util.js index 065d67e8e100..b4ec506260ab 100644 --- a/ui/app/helpers/conversions.util.js +++ b/ui/app/helpers/utils/conversions.util.js @@ -1,6 +1,6 @@ import ethUtil from 'ethereumjs-util' import { ETH, GWEI, WEI } from '../constants/common' -import { conversionUtil, addCurrencies } from '../conversion-util' +import { conversionUtil, addCurrencies } from './conversion-util' export function bnToHex (inputBn) { return ethUtil.addHexPrefix(inputBn.toString(16)) diff --git a/ui/app/helpers/formatters.js b/ui/app/helpers/utils/formatters.js similarity index 100% rename from ui/app/helpers/formatters.js rename to ui/app/helpers/utils/formatters.js diff --git a/ui/i18n-helper.js b/ui/app/helpers/utils/i18n-helper.js similarity index 100% rename from ui/i18n-helper.js rename to ui/app/helpers/utils/i18n-helper.js diff --git a/ui/app/metametrics/metametrics.util.js b/ui/app/helpers/utils/metametrics.util.js similarity index 100% rename from ui/app/metametrics/metametrics.util.js rename to ui/app/helpers/utils/metametrics.util.js diff --git a/ui/app/token-util.js b/ui/app/helpers/utils/token-util.js similarity index 100% rename from ui/app/token-util.js rename to ui/app/helpers/utils/token-util.js diff --git a/ui/app/helpers/transactions.util.js b/ui/app/helpers/utils/transactions.util.js similarity index 97% rename from ui/app/helpers/transactions.util.js rename to ui/app/helpers/utils/transactions.util.js index d5b7f495875c..edf2e24f6dad 100644 --- a/ui/app/helpers/transactions.util.js +++ b/ui/app/helpers/utils/transactions.util.js @@ -5,7 +5,7 @@ import abiDecoder from 'abi-decoder' import { TRANSACTION_TYPE_CANCEL, TRANSACTION_STATUS_CONFIRMED, -} from '../../../app/scripts/controllers/transactions/enums' +} from '../../../../app/scripts/controllers/transactions/enums' import { TOKEN_METHOD_TRANSFER, @@ -21,7 +21,7 @@ import { CANCEL_ATTEMPT_ACTION_KEY, } from '../constants/transactions' -import { addCurrencies } from '../conversion-util' +import { addCurrencies } from './conversion-util' abiDecoder.addABI(abi) diff --git a/ui/app/helpers/tests/transactions.util.test.js b/ui/app/helpers/utils/transactions.util.test.js similarity index 97% rename from ui/app/helpers/tests/transactions.util.test.js rename to ui/app/helpers/utils/transactions.util.test.js index 838522e35f23..4a8ca5c9d985 100644 --- a/ui/app/helpers/tests/transactions.util.test.js +++ b/ui/app/helpers/utils/transactions.util.test.js @@ -1,4 +1,4 @@ -import * as utils from '../transactions.util' +import * as utils from './transactions.util' import assert from 'assert' describe('Transactions utils', () => { diff --git a/ui/app/util.js b/ui/app/helpers/utils/util.js similarity index 97% rename from ui/app/util.js rename to ui/app/helpers/utils/util.js index e27956a45721..c50d7cbe573b 100644 --- a/ui/app/util.js +++ b/ui/app/helpers/utils/util.js @@ -1,6 +1,6 @@ const abi = require('human-standard-token-abi') const ethUtil = require('ethereumjs-util') -const hexToBn = require('../../app/scripts/lib/hex-to-bn') +const hexToBn = require('../../../../app/scripts/lib/hex-to-bn') import { DateTime } from 'luxon' const MIN_GAS_PRICE_GWEI_BN = new ethUtil.BN(1) @@ -95,7 +95,6 @@ function miniAddressSummary (address) { function isValidAddress (address, network) { var prefixed = ethUtil.addHexPrefix(address) if (address === '0x0000000000000000000000000000000000000000') return false - if (!isEthNetwork(network)) return (ethUtil.isValidAddress(prefixed) && address === address.toLowerCase()) return (isAllOneCase(prefixed) && ethUtil.isValidAddress(prefixed)) || ethUtil.isValidChecksumAddress(prefixed) } @@ -315,7 +314,7 @@ function getTokenAddressFromTokenObject (token) { */ function checksumAddress (address, network) { const checksummed = address ? ethUtil.toChecksumAddress(address) : '' - return checksummed && network && !isEthNetwork(network) ? checksummed.toLowerCase() : checksummed + return checksummed } function addressSlicer (address = '') { diff --git a/ui/app/img/identicon-tardigrade.png b/ui/app/img/identicon-tardigrade.png deleted file mode 100644 index 1742a32b86ce371dc6754660e0effe31bbef5512..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141119 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
$!^&k9QRw6GN3b5*WkEES5I+;qS` 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 Aod5s; diff --git a/ui/app/img/identicon-walrus.png b/ui/app/img/identicon-walrus.png deleted file mode 100644 index d58fae91294a898963f310412ef4026868d8fb6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388973 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%0A~L zM6(9Ry?YulFpUWrhNQrv&Fyovll?KSwL;>1V1l9)yu|v(dPlo3ck=0>-JW7&OBU`_ z314DtWOw=7HyJh;IfI+Ja>}c{A8RmvWuW)@ZqmzEoXUpcbew(+qivtzfa@z z-^T5~jsHL6PV+iVo7C;p_xN2Jv_p--S8s=*Hs(DSD2%^8+wiWT}W(+aM_m~N7&H-bh13P zBw@eRD9PmdaENx-iI{u6Dp((u0oE?vk73lm;kv?P*sokkoZ)#IDE@5j%tIK(gbSX{ zq&t2er9#6bpzk?1@5=zw9ox|FXwT?8lz{>0ASNS1ct_GOJS-sbcBb!LdvlKmgE^eR zgksQ!I+PT&y^=9Q9U@E_$6Rh6!cQ?=8E4zodp1ZjeBVhxB@r;?#A%FolYN_9b~K&{rC?kAFsD7|>brR|Pg z1~o;+N0{3-w8R{udh-^8U_6u&0oLM#gr$1d{LX+;dAYC7tBJgtN#bm4DXWP`>cU z6?jnM5uXxqa}^&!G$G!$t?zYpO;|9ZUb74yNN(I7f5vC5f@P&7D#4g@9BAxe9srBF zD-}+i9GE{;*fli!n->P#Z;~-HNx@$nXi#ziBXFV^S6oq64V=WIhDYAhs4hJv8*sy9 z#bfZa!c?kS-Y>9N#Tu71vZEz+qd-VxsI!zVWsu~**|0UlKEg!j=8B~VxLcg=0=mvQ zlJ1grSabI4dW2e%>bNcpMp1vd7m$7kPT*l7mEGT|w!|8kzN7^1q(K^?T6-TIi#1** zWJ-nN%mJ&q^XW;3okm=jL-bmV?v9keJLECJzu#lFr*R8r{}d;^J53`+dC#RLvtamC_$i$6tk?H| z5LWf}>CbXa_A?IBb#M_u-nK`7UJ-;>?>@uX;c-eB;nylx`{dp#%ONf4DxNT^O0tA< zhZAI41%t`b5iMI*G&`U1%SyG<`W$L|eQ+jvEeRFk`Z67&^Wr&`NB3iGKu>c&hRGY0 zm)>(|U=A+Ja$Ey6V86}!r6EAWHT4h2v!4Z}=j*=})%w-%RSecV!ck8NvdmbR)hX5a zYw#d*R4RmLL0}>GO61YjNQDr%P!XF4eaEH>d;&)+KH+)_jGM7FmXHy~A6HM3RYfF?mXCrPN_uz*9!$OkZLqE<*x95{vExJT)guY+6Z*pENj1Vs71wNOkp_gk>0+4{}$;z?^HvlP%Sf|aH6nhlH#WROZI1aos@Mr zzl52qa-=BE10GR(dLj&6fUyDdg%PPb-N5+n-7Cqqi9OQ)1l9S?)rY|!8;-oA97aA5Hm+5y%}Woq^v8Jjru+dOr)nR)p=BMcvKOS#20 zcz;A{bbWk2c4EbZgt#wfg4}g8@jQ3V}pT191aeo%x$F29%xPJG{ z@U8Gl`?F`C=B@W*?cauw%&@|wi$~fRb%egW=NwaFv+@p&6h8V*b|cTy%jA0O8nGiYH`v~v3OlCEWU23~Rdc=c{gdY26G z=*RGB!QeD1Z+;mb-)#__=3(Q;Pw~eTl&yZ@!5_m_J4IRvKThT^vyzcWq-PM*sXyAq zZWWUr2D3*|+14{>z4n2a$=XD;33-LYO)*z66V*LhJ4&!rHNg`@t*B~IA}U$*T_R;! z%(sZfjMG)dFd8>qOI%eODY-ppWFa$vffWH-ay!8o_!@QySEOWO3DEdLsSs8Q!F3J~E|4HLSeITxyu6R`g7vBk4igW5>S(unWUEG4j8cwh z6PiXTODRmouO#MS1lC6;FX0FYF=SNoBA)n?`IH(o3>v_v^_NMBk7!5Q!}I|IbW2eE zsSZ>Ek8j3Ev@zkqOv!VBwW#Z}UYli@hA&Qboc74%S8ymLU0c_i;Vp--bZ$9t-Hggm zeh&bEkfXM}=P0^6*87xlwdS%XwptHtgZLmlsxoDu%anf~_}8LeQ5 zGRzOxOfIGmoP_hs;OgUQ@L&J?zp*|{pJ0vfoU~ULNa72mE+j`#Nk3zMsbe1oG{d;% znk_Kbtl4_%j?#4OZDht~eAf_dDU7K*wZkFmS^IG#HrC(6 z;)zbbOexO&ph|mAfOI1yTGtYdYhSO4LRMB}002M$Nkluo#mlVCS2wgx z8C#ZZMgPNtNf_t9(zYHgNVTH>sBU!(xz|)@yY;UBwr}Xl@AO%DSNaOC@0xVgx6ji! zr+M_>s(X7^VdZ!FUHr@2p+L{_&Yqsr>EZU3p?0Bn~Ua>C^OmzLqEJ&m?EF zM}-0IjgVj(XKkfQrUA(Iy^#pYVA@a1Lf=DzGa8?|9>M+l*xkU*72|73A`2~2!wE=2 zBW#FB9SHtpQ*R$zZyQV}7~T)dGH~2Qo|rG22e; zRQ>G2!NdvIMVzU>WP3-aLv1Frm(kem#g&6o;wm$9qxM-CFhEpUkJ^y8jBkN~#!6yC$yA?e zJz0dw%9vK7;~jq!)+#mVkSKcSvYV{8Q&eV1G2f65r&#tuGnr^WxY$17?B8`L*90X> zNvyyFjMOsQQZhi-2Yt%K#idLz)TH)N+Z7xIlLMEgBTC>-)trV%GDrP+#3TUE@S7_o z;2AK7wt(wDQtk^4>_?8s-m8#`I3kwq;8S`Pp{j&HTNx%%^L`;!sy(x1Qn2pSQv*j!(nuyN6TneVBd) z&v)Hv`qOXASn=YerFrYU{Qm!ZN)un#;m8d2mp;7bH1LcO)9@VF7H_okWXm5bEM3lu zAA$MZJHJ)8*x{nz(ScK~X(J?om&lc?Lf2D&H{jNW?}}R4SV$I={7V)fU1JhdIeTVy znxpGN{X^ly`E0++Ljw&R-7B7w5V~`FC;dT`>lk2zZKSx)glEC4r(yY?a4kWqaFa+G z9`0w7HG!tzsRk`3D3g!6wAqQwHHr!jjl*CG$uSU=b%;Sn#eGnvwkg7kW3@tc!)cFzBpy?zMp@uumuH6WoMkq>i*AQ7@ zC1GMqfCP??C@h(u#Ayj3vQOS{%8ZiDnwkC!7LRe(CX6Sp=)#Ir!aPFC5JyT37o41O z$;m2b6IG*-Fo>0eRtB^p{etZP#?_Ki0;tnERlj0#Dl|2m$U`V>OV_Pb+$H0)eiJ4X zsz`m;f>T%y&tS9|=ByjDGhg8eWi0xzg(V{Ce=$zy6g=i@(Q# z)?S+=!??X;I|l7w-l`!l*!JMI8`t?f<_&Y8!4qTnnJo%C4kVaz(D`p)zhkf>bAri{ znd@g~9GxdUxZ&(jPm#KNWb%O;c!u@o1?3wvFrFW{yAkPrjrj^WlR%#v{k36niMnKnzBlyz6iVgkv);v%?~^AMwkk0!OPdmZ^9^n$j-u2}O ze+WUjKAnDkGaMqAaTc!T9e#^`4H%rAWLlp1d18v4L_g4`=FeJrh!+rurN9radn1*i!K{`1McB*ePqMzsU3H z_pgIb^P9o$#)H0*oY*&ZhGET|y@CHPWpB15Nsg;&n%m~Pdw6WQR-T@|Xc-xie*ahL zi#bQS>U4EgW^BGMX6A15eLoat7EzhmGK?@+RVtMPK@cE7kX(+g5QeMKE9TD^I5>Dh zf=disOXubRcjSv=1GCb@68C$4ZLU$U%V6k+v;#QD0ZrNvR|*O1VO>o#h4DVJ4oW8L z+^6ZWAVz>LR+va%INphN%HEpLyiOHrp2jLe7qU;QYbM(a~GxCedK0;N&&t(E|pDA$@aB9rl^`^`wl)HRlo1FWjPU0lm2tr+2{d zsH~5l{vN^QTFEEc>KSXpDQiq!M|ybrI_B1E1_`!@_;wJZ@O5D4TurH@@#RFPs1FkB2csBgrRYPEh&co+U>qhDwI_5~U0~>88)S66*S@!7R_F$*k#q}3=RIuLZrm6mx{roO|741s7}G&g(IBox6*J3DgD z0&PAnVWfS{%GEa9;RGxNVCNU3H9%O7(jx%5noshi zuF;mzkPIGiROU{599kwL@B>U-`|Km?ew8ODFgz>^FPxz_V^7fx0ubB^DfdTxV$M*r z))A&G@faFm@%};v4NhjPXM5INl#L&Re~geCBShWd#`d>soS^~Sk}{fgZDEwwKk6ukZ5S&O$|%B7DgG~wv1we!qahTGv@EF z8M1jR5KW_%$bpRa?hNE$Rr4YkO1%!*(Ip<9Fz%Qa>2KoMe04-QK)Vr6;Soj$BbIf1 z4BenT{qXZoqtC1v6faraj{tQWI{C*jLRLox6cI_=l=Xp+f-mzZd~Eqfx4mV0-_Mr0d!Ogfk#`lo zeQ(}|-FWXizOVIl{q3|#x8cvbDgOL^H-A%p``mHAm&viQlpSs0Y2jh2x&yMhZKXkc6 zek4-Bb{XcMK&P`JyOlBCbpGhVm29Wz{?r$AA#<%XUMbe^`s$mmLF5R}scXJ4S)khF zk<`vJnt_6h9`F@xJ4iQ+oG?DX+Pwv=Z0khl=yH?RY-D{U^;8`Z|~U+gC>{*>%>tYLd4xRXB4`xV1d&(M`#C^kyy4x zX^s?6dVq%U!YFjkkkMyu3Z|)-JRqJA$Y_&fodnU&W=`aCm)zYnMtiHaDzJ_f_cK!U|I`C-1iXw z6+6yoa&x`p9wTDNom6tr|?P%vzbYm2s4(2L zfHLj2or=bM=fZg7-FRFHU^~bd4aJm;=_h{}Z5E-^ zPi-HMq4LNk1*7?@&3ovwb6jec3V$~q5O;byiVyQwew$v+2Wub$g?-K!thvTBJThNi zE(5n|h0&8O;#>ohvW(0F`WJ1~ZRI$mf&mStXyactpi#LJi^L3KDAqg(He(2ap=HCJS}$c)7twZ7KUw{{_K?-~|`Z4gxPX{1Uu#Mg+bFXos${wVlq)vv$b zO(~o>USJL}G;H7AJ6}f)>)+5Q4luetE+ufz%U5DjVU*Sj+~hkjDM=w^1V1&9vHt5} zdn^gYHBM@*^ZgeNdYz8W8DY;6md?uVlXeUv(xJwkQXG-%aNw@+nr-Z`&M9Ti5|d&( zdCVDAyVcr~G#(d}`4b@3V~)?mpaeC;rHuB0O(sGogk`}5-Ib*nhdYeORMZqa(#PF7 zZmzDg(+pt2U=c#Vml*-H_c)6SBcMOF?d!>vO*DV9mTVJK5k+8QOVb;IY8Va>Af#BFxaM zLPJf;1?o?DqAG-($M|j z!X*)@!>k?b?1Qum{G#xyx!T=un3kcQI+ZElG6e+PXnLMOZyv4XPB+rM11#}uJMbs) zNcmD@%u#0o*Pf|8%1qtw)O;y80!9Zc zapV#RYm|4quF=05l)}BFmex^B{Q8Lgj8vg?x%`4hSt%5M#$(^&uhB`+9x%yQ&a zCyHYp187Zr5(54S90Xa7{%Wsf#Kpk3Va zHgh}V;eg0>ryl)go`>hJW4#bh`@-PlAUGGsJ?QKx^PxqbPA{eZf?qcqpCCxpUIQbw zaPt5KHv8|`bfNX$($4a1`rr+rHPehv8$I6QQvrPD;h@Ymw1ZlAowAse1b@(r1=F@! zdcW%`miXz(|>!VD{RXm=hPR_^1UE>QYgXi`di<1{=33635AdM9eS>(pa1OIgcV#5 z30)vt<=P1=Z_O)#0eBS(yP;w1xbRlMiN5c^&O>^X){?ex4rIotK3h+L+Asj~qAVG& zo!q=73z_Xg(-t6Rgea#VsCB6sW(N<k0>`M z9hfnpn2Ym-%;zXjTxNmbP>8x-D~t<9r{=bX0lL1>VS^e%1`tT`Lzq!at~l2y+uf2* z_?>e)WY>}-PN=^F))glp$mPPocyGNt1o!jjI*3>r$#!MIwZcZ>IGDn4=BT!+c1Zh> z&Z~k&m<{G_I+>;K4AyZ4W7o{)yFkx3ez%*C?_}=Ax7pHfjrVHWzBm5}f}#8?PNeV~ z%LfA~muzTba0w$cy$o3a=`l{eQ|sMFKuO!rYVhF0JXswl_v8c%7s2}trc?xo8kYkJ z*J0k{7^Azrf);+RdKEM01*e1j@a|2@d*a|@7x(}A;kP(HX%U#Au}yKT@u)9pj+sBY z0vbPN^_+o-snp$naz-Np*fo$IX1I^j%ryeZTG%fac!vs)%O}K(2Q0_KlRU+rCRCT~ zX!=$liZ|<*zGU4HMDF?%S};G-i4=vfbJ5aR2Bln~wBTP2)5|5rWgjxTx)GHHqQZoTArSq4%|?D!q}RLXqu(+{Ad?)E2kfs zDjG50mZxS3L-8cz6gPe^SR=63`e&l002J%`fe-UA3kqV=^PRNdn$10h{Lqe;C#?&Yg1~&^3jq9TE@THx&@!;a zEDIdcr}gtd9Q0-RTS+YZ_6 z-sM!lrOE$U&sZ%%n1mmw^K6D@tsrD7Lho0%$=e2DmE5WwbHCvm)#r?}eLF}myJ16X zLnIL7?%VkOrnBGXxy?ItJUq&^l7_N3_r!I+xejo3oMnt9vYoK|&ihzcc;E4s(f6Cr z?Dr|PuUkB|Fs*O4@%61dVUx=cwXGk6L8-+E8i~uE+s*$;Xe2qBGrb`I*DWws$L;vQ zJftyB6U?85oGRT3hWxES3*QK0dC~Bzq$V7Gsx7-=Xb_`>v(;#y{{_iL4x#I2L(3RC zI8RZ+&=}v^z%YLRN<)a4At;!4gU>=2NX;~Z5TESQ5|tIL)}reW<3IA?f8m{XJJoZP zBws87@H-Ys@87et{}drOK_Fsw!ogt7JRvh6cxA%;%~2f5NVOxOLb*?;!d&=dX#MMs zC1ZBGw(_XCKHE$BP#}6uT9~|*P=l7{W!!4FmNC|uin^Ola?Nfv))$kxX0$0< zmS#=cQ)x0GUlOOxC+c(v451Mix`OnWwS_+4V|m!eLFR|=-sO~wzy0-pvWE0Fd0yV) z(TQ-Hvy;m;rf3Dq91U^K+R+h9U0%@U#m2%m=bjm91Rw(zwuGBQE2pdjnuF_GG)a*Z zb23}HoxO5#Kk2BK;NG(3p5|D85I%E&M_2}EcLdcPR*Te`N^Aag4$x&$;stboo6^X| z`wGEnom_S%eS2>&6~}rXdw<3DZENXH{DL2+0NlFIKo-zrwV`dLkk$mfl5TtlywZox zJ+8f8$cFi@;G^HucGc(2YfBF`7%^pqPSaPi-UPqvu({uf>vvxJ`xYks&iH=Ual7ev z?@hNUXGpyJ?ETPf@;2{8N5fR8sV{f)+P#k;95UazZ1UKN^Y+_#pLgrC`#hx^!3Z^x zXy>Pa&>~EbL;?xt^W*BK5GzsXP^8toq6ScfR>vN;)*K4-D@S2AUNzu)bDk9O!@I_X z3}!hjTCXzsitN1~is3!wR8~X2^*%5R%sk%;UkiH8ZWN;VLd{R8QU?eyV+%APiBM7H zNZ253eRU*Sbx;<`+(?r~k!kXdPA9{0-YXqTc*)0dBJjXrP4ZGc%uw{$~A^>+00F@J*wfo6!#}V*bm!4uJm#K_tU_=Kes&Mw$CCxursu9XJj+3vK~X+@bm1GCwq9Z%P@T3T1&Ep)Vq)8ex7IT}dw4gp{ z3c$L;Vdnbja`cLIlo#(#OFN~}6}&EAx#j%@%yBfu#D_-sh@*}596K^cNIbF*Zpyv% zu|m6CFbC|BLa;&bPyfJ-ryy1+g{B6frFr%N2M^=aq|}<#cEeD?n^(1g7wXYknr2Dw zDGcGG*^>4J*?M3e@_S?(IUUX%V7!p-5Jr6CaY+Mw>O~5STXF3W}kFb03OcL?KK1QL6j zGTY6rL-ZdsuXFm-1#NYOv)A#2Q#0rf3N!Kgz~Ds9@QB@p4oI(sB%h)i7Wb(bB;^+qy1%$l}7Ww0`!sP zI#ZCY*;+xoWTS<9JD8^jfjc#~XUwM#G;`VruX4(W_}407=OfM_t!*9>1Mi?uG_NwM z@0*`3@GkE-hB>(ppCVJ9m_{hCTX~)|WEuwq`G$V-G%ZU<^7ae)U-+G{!9^I5R{nBU zqsU!8oS=3Ly(bLsY4?Od$UVcC{w(xh!8F-s5Ex6rDWRS11d~DKtK>=;@-G|?QNiC9 zgHyfy1m3xsc8g8rNGPhSV)b#|D>Uk#1yzIizV5#rSwt6#HdrlK=|xcGSPejtx=k@ZNzrNpvQ&{T9B}k}DQ!jFjAQXv2ONahZJ%_Im6mYyqBZ}Z|$U>?e zqib*KsyE*%qy0>k(i@Tk6@UEkpKEZBP$^u4Z*XtW44H{#l1>nGb`p1ik$EfdY(T$t zzILgZk&Zmp@dY>ZbJl;of5pMB$LrC_-d)anqh{nvWs)yMP1$yS>%G>o1Sa&NIg=!6 z4hp%XrI0XQUPyH9?r+&XhjG&Zyoar0axM7H7oHWSc)|wPzE|*05ejM&ng*pB~5{_82Xp?wM&lk35({ohMNSVLQaec!w473UbS?WO@cX6U;W1A+0 z$211v_1UZV=pZfiJJb5E)Ac*wckrEQTsvpHW>y*V`8mP?94w>_^6}^Q!lt&OhHd*O zq#HiJH(lp%dh7WF1HOD_(8Jtq1|{H^Y%_=o-SVAzX&N;@w=MIkaQ*bTPIN%MjCLpO z_*2vK49ko2)2w4nJs9vk(%xqXtGBN&M)R}REQ(@9>sOZ+~giwmvewJ=rMIZWB~QVW)JrtKG6Qu8&Z;-_$=+ZfIjY_ zhb4QWO6Q(*;Sq7pak?k0A+*c0II|vElumPK(%iHKbZa_sEDptu{n_;5-!|Idm_Dc0 z9cLQy*F)939* zID0zJLp}UvdtT!J|8qCpRR+%&si|<L^>7l$q24n;X85ufLuco12NbUt%ry%4bGel+q%`Woo86|4jes+Ygxiq@C@aO z2XDh&=|C-|4LFPnz8!gqRt616^J6+cBUVO8Yn))RE-q$25|c*Fb^_x+!xQZl z0`Tp{%jn&yrW#P<&MXYmLCDR3@AUMP zwSziect8+RL3N*Ld zj_G`$uk$JA<}tw(Q=RqujdSwWEYjD5@d)kJWgM0*t(@ajbI5jd*6$9%Dx+(TN_ATF#kxUz1IC*usp`JMIf*Z0PoZ^t*?c}+a{A#s>}@Czd~&jauUqS%$Cmc2Bb z3PJ^3!`cH>zp>1QXHyQaI9QTFJ0N&Q&>hg`3JZ(2U+5|9+QSJ9TJP7ngeslzWp)4x zbEkdMw{#N1+L0#0^a!0jvO~)kmdLnuqw~lYXmlqz)dG*yk5{z+`RENNSGd9U4TFv` zLdF5%;t5Y<2P>2#)20S!c{;VMMxQWA)@Jc|qoRfFADqUDvgF)F=X-SoJ3KhYB!7ya z!yJtUuJuJ2?F-Vu3G?8XQei}#!Sv!(-1*Z=qmXb;R~k%5C!Oss4*gz@ zP+pKcsE11?=Fn~r5RD&W(oGxiZRQc_o3SV{NYnJG!;bK3J`L}spD9G76W64=-JC&> z+YW{QZ67s$nKs#pqfKQTwrkz-cc20LtK8Tv5uKh&pnQY%(OzU)DsBuv=n|Y%Xkq8I zz6tKM+$9i~d!MU+C_Fb?aVB3A*895h32FW;G@YBK`;gad80s<9H*iNL4QaT1oqqeA zIYTSaAau3+gW!n58u7G7(F2TI7)ttYL2;d&AzB_l(3IRaf_#B(#Rki7TZyh1q?=A@ z9+v5sv{gdEP?c@?>dm%75riEHLQH2-3BaRfXKl@E5Mj9vxdQJNCQ8oto9w*dbqPVf z-(*~M_H|DH`_9@2&SY-B-~#*r(O0Dipo0+-Q+EgsX6e>l3TYhfWx%$!T8_xA8_uL@OSjRozA^!q zGR#@r~auK$wBaKw%b$hka)y=Fcck7i_tIp^T*2TW=! zPH2~@-C>rxM8Hll30@!!r#NNY+|$}m6YqRiiCzxSQO z(0fg?(cTz*c>m=y8(+&%r6uz9YC7Y*x=v08?|iPB-yL(Q&kSHr;^B!Y4^2!8qLAQa z3S19p$}VaTOr&*iD`P7Srvxhv98X%8K0SbYcZ0cS8P+}noL87Uo%j2Ur|S&*cX@(y za@bolxbY;72oCXxpi^^w00$0Sk*1V{d7Jc0%%F#w>k-_((m6+Z6t6c3%U9=b5yppg zKrnN*Q|GUl!xRULI9566r0vxD$X^ri#$p28YG^L#N781FF?b|@HA&mV&^ruuo7sfo zUx99%+MPjMOPg9lUNmZPGFzo{JRE0Gh z3O$$TRA^!8Q}NrxYdK43A?U-7e5jXy_*Zzp4K(j2w6|#L8zJbcZ31z>8*Gyf2*U!d zwYRZYGJ!-hWMXntRmyrwdJ3yKw(4j>Mt?IDvdLq3Zd3?B1LC!REtZAL5le@_nLM_F zr{8^b9Y!XuhZ8nOEfE3`S8pcX=~KRChbXr&Y~NQSS@r;aT~lv~vFhD8^gD^xV4UWj zf*W*FhUv@O6r%GvOsmqGvEuV?`GpRF2@0m}zN{fmoI=J~zxgow`D8iz%lnhjkFV&+ zdpG1M(?=}v{WHwj-8($i1fC%cl1B_D8PwV|YEuf8853>J5rxS!$Kl+G_WC#hz;tD- zj#PzPb7|K}r-LyjDGG*xb4(9qT1WSFlqqC!I`w#D#QuVppswpw7Ur#|os0{n0U#eg zeZ~QS9czg9RC7n}GHT6WGPfD^ae6^VlzkYYCOQS}6T&`+qM}L{ZfPUZx!J)XTH_mB z`i~IC_ux#}t}uI!*<$SE6>k3E-!trV%yFIEp>v!FS~VHxJ#P>?npkD}Es&Z<13Z5e z5w@{-Y3;1j?8X~cZC;v&@5E`(DHmQ#tF%0y{bq^>to71dXK+7RP08-QqEn0MI<0w{ z)~opOcYCAhw=|YcXTCk6mZ>QS)Ij!G=CVd>atc@%iXn{a!TChaV?gV*2{{^z%9WrpAlm~^l*{}L+2!!)bAR#J2J^_81SK${@1 z20-v1=*~RNU;b7cg7VZ3Y3~R-i;1E@weSac8G9OtXH?qvfK#6V`I%NP0^G&uz`uLd zH^AVrV%CM+NK|#mSK^Ie8~fg-Q-iBmV(9BJ<&q#c5>LauUu2-<%@ES|oxQz-{bM`q z@>}yVWGZe0Pr=&hy{fJMS*SKD*vzx@?Q5D)gd~WAuR{xUV*~r}+Is}O4O<@>vD<;f zl#I)Qe5d+8RB6Zv)Ihi*wE+w3C2hiBCQXA30QRf2WCIculYi1QEWAuZ4JC5#pu$5y z4Z9WDeTL=|A^;^EzLS9T6w8QRDFMLY4#d`L=^)Du5oi<@p55J*1%82=g(TXHr zH{KR5~dImD~$&v+;z2+>w7-}4Qvw?F$r*V||D z;+~vd4Gt3Oy>0DJ{B6GrQv{#BQ>!x%@noIEv)_7e-4!BUokvxu`E7pCs^3OSB+j|a zHuZHLeyh3J{LRl_!*8DEV?>u*x!B2}ld+&=siXtyu2&UtcY+;rjM!N;hHu8b@E} zFU=Yn?%n&T9&WxUp{RyYf=^;kJXZ@<5E2o!-+2BH2%2q>mQYyxS55D-)#_)P`B zuPkNcRaS&@T7xt@K%0k5){jlw;rA*;HxJxp%7lQT5h4N@b)_CUo|skY0PGQl2m%43 z0c9LpWDbp%cU7u=)OtFGVGLVWg%1FlhfK&2ViI135b+!QW>q}-LTt%KB#>#1_}m$U z5h2WD%}93!F3&hc0VmPXcV}yu{T^O+bS5wd#p~6kW|%oe)6(hf7@EIbS0^J5zQIGo>~k|$cc)QPq4+xEPi8^>5uoJn z!uIJinkDAUi$fRJGfzlc>V)CGkf;iy&o?+ukdLQ*?*sD@W>Xownjr@sz|+7jOwl!& zWDJu)dqD`u;Ldb{z*MZ};J%wLI8i)e29>F(?cBMMCY}ErM~*3VogJc8Gk=JTi>IJv z>6E0`<*&be%x2RrtKg$(VR|68K(QUwvivEyY+vsiAKlh{^?eIU>Bw{jaqP3{dVbF` zOxuFbwE3R&UL%Nz)B89BjWF|`%dNbP_hd#M@e1TsZK_e6U8(*bQJe{c>@XD;!*2hBO)oWRJl{TqWhwd@0|7LOc% zwQw*5rD>Xe#3T0llFxuaFU}RqCv*&&BS0Tr5<>ecI1z=Mhp4c`9L#{oP0nWw3{P0c zcu$-jn-2&=waW{Rl#-#RzLE_CC;J$vAur~E>4ui=pvj=A)y?1Sr#g8BAJi#>Lg|hm z9$YG8o;tBTGuNC!8SlEiOlMmf9FVx_f+touzpGP>8@|W+h3`EAjkP`0fxIZIh2fZi znRty>4UNpSwE|ZJD%y1%?SR4l?0QgxZSJq{`h24fVPy{~_RGq(aF|L?Rm$LzsbP~>{KAoUHOrG1yns>urPy>DDH%()s@SYBy zG?W=4pr@ofi6>=!(?}bn+TpFAc?pPhkX9_S>LXK5!^jMImk|@?wP2ZtXw08q^(LQf#5MC=ZlC6Pd13H$zg#Oo>z&N@Bvl`%5+_+n|aG`=6t7xm*jn#(1_3X4?@|oJSG-p~m4CwLzq|ld zK&rna7ib~=8WM|&0riv5lu*=mQ9Ljjp?nSalz9E@n$rZ@(>!y&Yx755%);jyhDzhK zOqEYQ&Uwn$L>P67ASAEE5yM!f!VXU@emX=0|DOeEz3XZ^@w*$`+OWb9pK?T8g_c7; z?dIeCbj8We4h9@i2*=X7DHRnqa+cFb}E8&yPp6CkZk%z|}_9Xe?bW=z#{Q+8a-i(?A#)X0U2 zYD{8=s;?=iivSq7Xgcz3=KF}xVtSdh4NCBo58*cdl#%-Tg`Y!u2$~IC6&-<2v8Sb&!)KaA6~HS7d!Ldpzw(k6P^$l zuD?7vb$d5fjxuNHnniJV_3$zCs?MFC!*rd)lrbN{IPZW>0j{U7<|gUD1BW%e>6xjQ z>@9dTPnoT2D~%Ix3MkXJ(2{Yg6)Job%HF?y`xZfkmJ3?_-goAGd$GXd40 z-@SW>w(U{_*Vo~Ji?;1IzkU7`rtEP_mZ1ZO!9Ha9w%rsukmOwpX0nGclbSjo`BUzRyQO^J%X8bG!HwF@ z0q(+aCp3aeE@b<)00! zR>eCJC4}+DsvG|HD1@t&U^=TrgLL8M!&{z3V3Pd*{*$uJn+#kYU{SkqHlza4?1N|# z6=A$Bs?lCbJLRGowa4$@G`$Xe!?c@fLzI~kp2m|x%-8l_9Jz5#@Y+z)x=J$O0f z-wfu1TOt~daIyg}^9d&y0K)Jkc@hFUT7Rz{G5x?_VI^-yb zH2Y3)j*)38G~6&+*hrrAhcGeCp4WI2-aXum-v9hP9eF+a@bOm$E-Y2y^n(TPE6^@) z(NZ}FFx7)al7n3k;9I`phmr!s@p= zAGv5=`q0BwZCNHKV^w=n=vbCJqFCR;Ct3|!vs#IQFd7kgR~-jIM&70MxrzB+)*R}r z0bnUprtW+5_~C~i0*j`&)DuRYHl$pG^%TCeFW>vlXW=oN#rNlb$rP5U_yB`XTRJ6R5Xj7$x+-L}U8MVatzL4<wBLqDSy4UvHHCT$&*?_-T58Ey!@>w)B8^5%a;I`_@t;m#xlgM?w&h265UhA?kG`Y6}377E& zk0w)@fNtChL-*}8*hw`f7c<#1fM?)EM<5UI!uvSiV87Dby2h1WZ9^xJM>Mk)9Yu{p z&C|Ue?Jx?sJ(!(DuH%M-FPT!1Zo#Cno~XW~F@lq>wqZWL4$~jzuIOVhIhnWEg<&yr zzC~;F^a7NEXsS0H<@5RaOV$vQB4%baE9F33aXC*3%3FwQhyWt^ss#zCCSc9-G$ zP8@08YzBHj9;R0-^!*#QB{NLGThpXvIjZ-)PJSs<2PpD4jpdg>E+-xFv1V}A?`$sz zfEdYH9w0Mx)d5-;-(52>Ib!Xg=D-8yZOzNMH`k1YLBpJ#x4r|1)D9ZZDxgNG=Kuge z07*naRKr?W2ThQnp3;*46s>APoZFZwh(F$ZwiZ~ZpbsntE;Tr0KqJnV3>Kx!oS4CU zushh;aO$d-{{W6!xHSIMuBDl*1r+D@XN22A--e+LG+&NG*Tqk=#U5-z7W{;dL3yJ~ zhYSk9o!Y48W3?yesXdYjDkQG7j&4_Bab2BwmnPim&UpdbMI88EA@8$JLE^ynT0&!P z!8>Pd;%v=Q88MP>d4jA2PnO2u*pPEM;WN4-I341iRJLE!Koaps82s&FmFnR0w_zGb zouUuxCJ)oUDQ0r|>NEZTl~)PDn*J#|mR_7wwQRr5kA4)hF>&Ja5YJ>oS=!`9KBf1< zV|`KlwW7&S0_5jzT86H7-t+ub9m3PSH<^iX$0x*gRP+*n{EYwqu#?NQ}>AEjM^>WjX zM7%bWRHLyI@1qGd!@gnrDd(A%XoO}Z({Z0iJ2of@qw$+K*;pn5Q9)w*72b22dlZP- z6r1&hGE*7W3I^cPfkOr>YLHJbEa9K?oH-+5CEgPaGH;4DVVSpRQ@Wo!RypN#1eyDz zr=hbC=?aGHe3M3cjh;zOn2we4WC>ie5}tSCS2=! z%zUKftHHYbA){YtB=1;!?OdoPQ|lBOO{3H7Fi-Q5@hQ~2`fTuBGf?vp4nu2grd99> zqr0x?q~N{gUeljpN>oEqJ9{Ku2fwRPymU={hhO>;wC;OkVlrxNT)h~JSr4{^%4`W2M9Y4ntmpeePLjNSFf<^ z@WikSs{-aqe$s|GV2LdKgv}Ii&e6n97sBlALBP^DgC?dCve`A6K49{;J`Onishuh0 zonJLC=ccWv!M{Ct^_z;bUn%%7?NPp_VbxRdT?y=S4%kamv=3&p2bO_Y@qN~@<{Zue zuip2!w$+_$UL6DigWnoQbt-H5EsSABe}6#x_2d?ppUmmZ6NJzU7K;`5bG@PEXBkB* z0sYwF2~9h@v}b(Rd2i6%cH_M7;5@KA&N|B_RFA+C4FzrRGzI?_Wq#!)58mX-gB+1Y zn$E17b?jftV8EInk&vGQWlI2g&=+}5%CkJQV;SPaAM~h^++5T zghEs;5{=dJo^gcHJc9c#LK%Ew*6E4sp7S)F%-N3ZR#v*ZTR!q5br!~)dcnIoqNo_2 zM61-y+z@q=pk;UpL*I3s{a&1VZlLB-%ZoV(GnONF@wKF0y2yJ<{1b5KP-KX#rrp#K zVzxw($n4BN@Pe`uhMGWG1dq0M&z#=@b1V})96kOiYu>2S!LaVoHj}w1cn=X$r|f^Z z!n;t^?#<8GIC{ZC?=LK&U;shA)bx(oxx{+tQZKVavSqtCVLW2tx!c8EvoyoS{`+Vo z1{v*C(-p$pr3PdW#xLC23;>!CU)Q)uI;ZabiUxWCp zfsY#!*xu9~{0OhG%T$jrv1SiUHt2MoP(i4+=)9*z$dFC%_qL-WdY}7eIh*z!%INm3 zc$h4LN0YmK%zE@Rf!2jP=E-bx=XlkG6l}s|8&Fbq_d&XiK7P4oAX5Te*gs=#&Kk=@ z`y(_7PF>q-KXYB(iuu3?oU2wVyiswQ5uZyc^gx*hZmS0#j?kji20zh0x6I*9+yI`n zk#54xh%0rBshWCOU+dLB>*j#MXYu8G~7)4sg;-cS`UB1Z+kir6o!6Ip5{h3(aNCLzTY`_pR*Ow0QJUx0WWSq zzhb~3jk$zCaD-EqthLFmrWR(P#Zw>eEf;Vrga#|l=x+m5n|z9g!-LG!gtV6fW{-w5 zh%3E?ZA(YdKFeF}-Ap|#OBW@XJ7Be$BKDHCu=uD`)J=;EWE_Nh|D})5IutQltQCD%y z6EQh&ygP!#o3yA8dLzC6>_ohmApKTH3dzj8{W*$OB@o93H659;^G9(3MN5@-WE7f@ z#C{3ECF|AD^yo9wIA8&5G+{dnf|L&AjwT9Pf8scc$?4(Z?Fa^Qcr?fSca2bD-%+$@ z&sx+RbN_HnR~e69U$B!5rdH>WJP%Ih;C`j2n3+5geZo78(l@>?O6wgWB&k8L5dHck`o12pUWspjy|!XN&EyU=^JO_gqP@a4;w(cAa0vq{2)zP5z^o@My7#}(#m$QcleCZ#tIX1-uh;vmoG zn+N;99?awoU0GLgqy~1&;2`si;6MRn{k*ER`cqJzGS}*EF~JM%>4w-eY7IVy`umN7 ze-DQn)76PB3S`|?J^77z51Dg8QKC4 z&yI9^M3)1}i=4W6(pSl!@|3wNyiDXIzvdiNgm)X%bc$;MYKPQrG&5dJ)2_$vaEi zNG7}q#2Mo7XndeaMDBF-O9&hi3uVI}hm!aX4V|#bFHiNyIJnkM%-6Tf@8e!fW{iLG z#uE;bF$k*yilH|`6)=V{SgwL$_F>puv*4N&3ZjvZje%F|iOdBZxFdv@hprX9^Le$T2g@##Ds49SJO)fcEGR2`ht*_|uX z?VFUmCx6q@QPr4a;yNpc=N>s*XOB06|C5J8T6|&#LQ8zctmVAn^#cT_{R&uht=G)t zhQsdUFSQihmPhA@QTi-{STNELvxe)sYl){H?86{sEdCs12)A=inypLlBGBn+c97@n z*1<9ip6}U!`)_~$7*p)=nM*oeiXkI>4`9^J@oBErn{6#z;&?D!-RjY*KxRIy1(2S* zc0mVz_n59-!zh1y&?Au1yh7O^oYK2EYrKg^8NGFrnX9!n?RvHT;vx)^>m&1|GDv^M z`3u7&=Qw1LMuFtoONF|ynMZ^s`Nwfesw3~vXxdhdoVxO@!pZdF((=2EzLwSmOmq&@ z(U7F=ZUyk3u0bACPK{S9HmG^4G1|UQgT+9O;($$k(ZSAqpj(C26Pn)?t=WwgbpBdl zEphJHlUNk?JjHzP5+0T*l8@E{tN?76_wo8^bm%4xtj)`wwcx=G-G$XXOvRN08{5J< z8N`D@0d6~J8iksIgS6Q|_nF^@^T+BWZBTLZQy7XXakCH1S~gs&q=qPrGUNpVKpm;Z z9Ft~Rzl}F3SIaO?IGpcv&|sYTJ%YOzHRO0)%4^Uf`8QL8gO@$Sryi--9_tmg>gbHR zdN~2FE&<^%Yj}jbEkW3U$+G)reCU9(y>9mwt@wVQ@A)&P{0a&|=j^B+zqatK-HpgL zA;@o&cS*{`=`hxzd`YCE`oO=QfYBi^_5)=YR3HqlE-*y7N*_-oQy=DEX(9vzMDu#$ zUmTzbm|v5R_d}4bw(_B4x7X4PBf()*WZ=otdwP*dKxFh4B5ly2;tG!d1E5ZFZk_|g z0LiADs+f0Hr+%DirJ2c=f4EC`!YGA3#iVr)xdk79V{JMyY9112oU*!$rLbR1% zHWlDS%mM?l3kBk!vI~6F*YYb}y%668JH#f;Bu|G55%82`m3H)k>-pR1=)baI#&>M3 zcFL&lh#n75LuJ6j?H1+@yfd^J4tC>H;A9R5EE7*1p{0Vu(P%L>p%bPaB&_JDKJzCG zp*o|f7~ML7?;RaW#^7!-HYune6oaghb~%DrmgX(5G8uOgQByOo6(dsxvgXU|6^fAA zo1Q~&;8^e>BOP;`7w}M11(3%@8FX^7Y+=xeWe>CI65*m}o^>BTQ*No_;C3FxBrjqe#73CFre(8>$l)f+`NDD zc67oXrD`p=4`0~qe1G)%Ew*a_xW4=xvn&OT{`u=aM+YpG&?IIseaxw7CShy{KH*aX zQSb?;8l0Y=*1>1p=f$Orx|yVK*k0my3Dfi0w7&Pg(`z2JZPaoUhTgk$!{;XlFW@ru zldjQ3eO7Zb549a((AmSX{56B_dtq`QCkpx^jjA+H6)#p{--pmqTB zz@R7tCWMBkP>`?$8y=OP*mX$%vw#18|BCjA$<6&xX?v&=txh3WLc=*(EddeGA>(qg z5|?u}vcG09uwY(2XCcBIKYsj(puEmp@yP*eOsRuE>us>^hTxledwoElE99h6ms(h+ zeb)h=_2P!F#=6TS_#Jf=6KJ{0gShaAlviH}>7YIm4#x zfOJ7QZO(Ov?=4xG zze1jxldlR(fq>Tv@q;my&sg-#DDvTfn<4)S-2zR<-W&} zPzXC8IN2%?mZL^N_X5CjP1iP@W&)~6do>~&T#`{1Y~c_SvvpvF6FTp;1Q*4F0rp3#%hxmICm125c`d ziWLl6oE@=P_?Shs|MmSHo`3Er<3f6v59SaL%-ussjWvUMUZI3UCki8E{=p7vnf@MF zY9U@tvqE#T!|7CFTQT5f0rGtqvGZ2(e5CbVE+Nj{UE>Zjp^VJ+n09tG70W^SWR8n< zh^)g~;Uu$SL^{LV=;;NXXn_;r$R()PtP#r*QV8oALVL-#ZvD1KN~5=7%Dkd1%#MuK znIT2PdWGhoX$Xe)>|7ihbHj{GjX1<)T6r&7KQ)1YUsK-&hr~Xh#d$WN>xN_^Gkyw# zrv=MQ&@_$^NNxxBh(Oi5@9_~hKV9;k9GH80!7J?nA^wkFG1DQyJskGr80~?!d_Y*) zUe?=F5?;T1%bLI|%yb`F$96e7fBi$|ur67%7Xb$T2O!yX4Z+kXM+cI7Aen5a9xONVFr{6%L zk8IEN`LeWM1@oRzNBhG*^;Z}^ zKwrM^zNtV}Shv>s$Y3D-3u)q2YOlWtj^J7=tNMZ302460smVv??%dmhL6hJ3-3XR>;9lx@6+(~Z=o#cQ9r zM~@Sm%}#-V^_wi`P|)3(KLaP*KtUc}0c`a0(ApReo@Y4ul0oSW=P`P^$=T!>nyM*_ zxpVsnHh1rOqK_^Z$YkGMaHZo_1`ELF&NSDLUl{lb8Fkbw3jbKL{?c7~+#PC7M_XVa zTH%N^#+gyBuJCzM4m|aFvim)F6-U%d%apZx0H4M0 z%eo+c%~TAq7#4WV8=9Yn&r)tb+b*r>7N17QM?Eb#%Va(9=i$5hw)3d`Q%L_Q)}1H& zthAq__`+vvz#}h*CpmgFbJ7a1Hy}WPm`d@o-VZ>T%!o7-mmwJEQUpyMRYA4I`e(*L z2+wsMmU)mL*>oAn&TK)bA>s7HD5rSz`{#Ovd?)&On|uk7)&M zE;>TWF#(7N=Bkg+HM;Vy8|mA7^S30;fGIP1m9}HrDWf)b)p*hLA~SL+1P$1f5W=|QgdFX{}TA8Qbo_b=cWh8IDi6 z-&?NRuOa{PtUz&_FE`v?J!+W0EJpiT$WEBYQK)aEzA5evL8%YuV1~6 zcc?qZ=tWvb-!O`7ew~5VX9TO7Oxl$CSoZ@rC7{jz`S<@#9WZUP1mh5u{>1I%DEku&&Zl?; zs~J8~r&q5|vRp$Pou6G4Ov}>z#Hnps8dfcQSDTb^`fj(){oY`_UY35R@ZrK7sLMjY zJMhGqK-#7izcHU`@1g@ut3Erx5Wn7=zir-EnUEg5YT{Y*m-#K)oX#Y?wufyRdSO0Q ze(AbWh4&S^0I6k}M~?bp&}AQV3BfT-S6I>x?wo6-{tWZYM^od1LCujC0vt!8^>eOm9~eAnnr?@-g|?}~3u)~SE{J!Vw*_kzt{G&Vv0Y$} zi~?`1F^Y44@}vdrBM%ZrP?u2cQJTEH)p=s^CT!%6e<9kln~r6PxLK>_6&3M znzYVs>+hgh+jg_AZmYLu;80-@f*YX-Z_Wzcq&BAv3Wd9?@^&bmtg4%0C= zr$DUXh}u`Z?R>wzTK{di5`w)(Y=KAWKN(*l2({^-L6mH&&1m#J^7rS9`_Y@T>(Nh) z=G|ZV45Hj;w6;R9xM2Pn7-V8EFlal4!A|cl@xHUCz&JwW;3YNI+zCz>jG`TBN=)h8 zFc!5I_!$F;VkqKX0qPDUZDO>gqv48k%5;Yn*NdrXIZtmOebYXt&+n7pf;o~yM(l^|P~sL{3asRBiL|fzg^A#R;zr2| zc>97Lt7;{p;f@_kZpe3vRwjeF$9ok}Mpp>J1>UUArRn)8yk`tT+(+}nZ(m>UNfxrCn6Y!2kfB*ac!aRxhDke$=rkeXB z--)kJA1|ZnDGbb06Xq?>K+dnJ0UC_&pJgbNyjso_=IFalCoZf*F=XZ}(KKEdh>h8L z$3_3{PwSbCYmO+g{XGuJ@5Q6v7`*nNs@Cgi0^Kh4=(N(B+d?>G%+dmwdFLUWOEc|2 z<~N#&rA6WQ1dLC3?%trP?9)yTj-HqYUg5~)9I*8tvs2I#>&OFjKxt?GwFDB)iH6TW z0PSq;x=rxlAl<+&RMt1kyq{XNT^ zrj}A?w822Y`oku43Z3CcM_VOwHj ze8N${NpihZB`Wg@M)*$q{sNPj-PVz>PBSjLR_nvMg%$vfKv#P3Db#LQBbXgeFpbT@ z1D{Y2zIH@S8P@#)y0T4a<WW;zsCAkutA8iats`rNuD8)@U@1Kid}6Y$mT!{`$8 z-AM)`jHIc*jOhkJ_3GUDK}PBnq+^bAUut`5vd#fsvylIZ!(yccr@_v7=XPkCJDsmm zaPpSPb!QjsmgA`Z%Hx~BwRo^?43^PtjY=!!>W&jLN z@Dv#jCbyigLkX+hxT2h@Z|W_n459kAu-V_FqDsBTT2JXkJyx9U2A?CFi3F6S>-XRC z*RSDgSmn1>j$6=u8@|rtU*GShr+E@u7y?Z_D-0!8pd*3;lTxNul~rrYqI_!LbggDe zx3Oe%EUTKrmaGbv#vpn`Ff#WE9eiK**%&^ujMAa2Fck)=Wj8 z$72*t4pWZi%_q(>L>}gFUCVGTKy6Ojk8oyF1J_m}6t(8hVLUEYb`6>W)O|TgIr=9i z&K2{-=O^c*Th`t^A`ngxQej|}W4&EM@rYI?^KqWX?bKX|uaMHDwvX1LTf3SKhOEG@ zIq?{?s(7*vYJt+j6@pK%L$$mJTI&j(y=LM50h;Xp{u}dWXdgfR_~Yo`|GjpHdH?BJ-t5Z4}sq|?ZZ!Gd6&o~q3-kBu;pd0U57%%<=e5?Ef~R9FJPUZaQfpF_&MU~bm_ zK6VWvG_%L`32X=*j2aamiH2@KQgLUxK2(>QH<1~m*zjr4a^XRz7x#Bp3 zc+$vSU1H){gYKE@4phzqKGR-%Xo=$Cg!x2;>E~+(9JIre$_#lJ%EO<0tP^z+o(_HA zSB0iQ*y0$;b(`9}S`d=E^^?)aF}TR5g}L)0_2$0wFnOw!Qv6eIEYExE@_V84Y+Uv8 zw`tYz{wz4JYj6#=Wp2w;7}7ujEg){M6|P149OaZZB87-H^Nu)y|IGp2{F&XdrHp|qbG7Ms1mJ;8gqiH&i zb48CZO*KLVjn#F@K+J>OXO56`YV1Wo5*i!jq9J)zdyy`dFa({RY&*@TD@M375hP(4 zh>NM!eidB8ER)pXNoT8W2=NrNEA{b&`#JzsM+;4@<%Q~!7Cl&X%yH9Wv2cXeHKPN| zpscG}k_*-SZVB9Rou?E>;%WiwSQXID5N3O%a}@1-llhI;?BNPC{TYo-=6FXvorjWX zS+_ZJR{OxM?Sw1X4t5!|+sG)Am-75|#`JpWMq-y_tV@6B6h_>O z2TugqLq$F2yvQ|!n16iyE#}=l=FYav)NHEX**?;M&*H*z4X&k&kf6?9#e3F%MmEZz z>%D0^-xq|AT8{NLPnUV@v5Qh2gJjAQ4Ax`H9=i&i=V4H!Wnm1A?xJ&wC1Qq_e1%Ec zr3yLYlf1J>F74)^R9I;;LeZM@f#1K;F$-g^n=wGIGq#6Yqpdz7@Z6+)bw_`|8`ybg zBrF3@H9+|hoB=C`JVyE#2M!FSPw%Y{D9EM(!4u``7(#U3tHGLP^2|VtIvE@&*{+)U zwSKs4M_fzK&h5@IlNxG3qYzkB zK3zQcw;hxN#%_agwv5612o|$49RoITTa1x=8J$`C>^e$3^i%*^C`=ee zY1uyeO-8j8EE96{t$V!!Rc8~0e_Wh_$@NbQ2Q37JVKG75**u0(J1c-?l-B z+>@_foD!{_(0M2%O@xSWcwU?MRT%n>BWoE(Mr3q=a_m58U?QVNl<7OtODiN)Z+33c zqn@H!kU%D%&JS~Dc$WHks)RV;;|KtW_JO0D#(T#RmYJ(nos9nTKmQv1E8y>dI}8zO$-;l? zrTH#PDYzG}GFr=%F>kz0$w6VFur!#LgB4xRo$Ch~2qBzs@I*u&hYp&t+t%i5@ZO&= zJAZ2$^Yz*qiZo@K8G{U}4xL*&d$aUyKGi>yo_xiRgB9s#f|G^<(j&FT6THcx7a6X1y)+X5TnvNe0EnacRm17D_ZI zx=gdoPwyjSwS>@^l&Mrl5b%KmIP2`Fu5h7{bVxQ>L8w#plj2VT?Dq;1&{lbpoAtJ> z04H^{T@{838>bv>fAcliFRKj(4o+ORwfShK74O0*OtCh|E47FqxWc<=V@eHdHp7bd zZZw{00{b{+kKrE^<_sa-(OY%{(wg$f;0s3sHBK9;21=HML<(P^R>+Uq#!WCx8H~>L)D0~JPoV!u$u-QC~E{^ z%;w{+DA^fF4?Nq?4h$1^glflDLy&nrA}Dok$$C9_VJL z5@CQa$2V_rvcdG`{L>ydQ=qAtJLh+Ik3hcoY4rW~???afAO8{O8*xyFFrfe~ zybrh}O&Bu;soA@DyR{A-LEJO}f{ie|zGLYFPD46ls3|j&Nc}V&EBsFwWJoK*?X~H? zX<9R_b@RRW^=c5u;z)RDti)BHwOiVQ6=-P6w6CzSBRGQ$wt@o>t}T?!I^T9TxkR9{ zOn*rJs zT2%Oc{(L$5f+N-8+3UbF=BTLE>LzV+ipkpJo;>C$f*-naFotJI>itCju^ut84tTN+ zHkt`_E@oMMRlf-bapOVI33EWB&BUXc@f3RSoJITb9LFZVx1Ake*bdU`oc1wTmce{v z%(jUKGdp%4D@5tH;g6Il0cM>iJavhKAdViKS<2B<#E;pDCW8eA0y%b!LHHxf;*PO| zEFKtCGnRFiAF~k_Psu553w-cTxbo5~xb1pz6ZpK=4p#N70Q8%>3TyGJzJ{NNR%|xa z17MV=`?>g2fPNDK!zRxBiYAT9y8#sMvqpH6c6iUTa0jl2dne8At*?vbhq~{)WUEVw z)ZF|7VbkamgkDFw3fH_Cz*!*~1M8)NFwe?@AgyqzNopxHIFsrkrc4ZujM_V^YP8s6 z?>=uy18M?FOl&k-D!#%SQ-~=~E~8+U@Tmcx(BYZm%qWzRpLs{vh2bmQAWGJm1%Ax~ zdYr}tgl8f7Su88MxCd%~Lqkn4tJFSwbjrmg^Crib7pk7mtc%keJ9Yw^Wfd>Lhim`` zYB;X!h4>4V?Fm-?c;DC5Bg|JGDB^j*Mdqfb>DMXznB1iY;W#`iD>@H4f>yn|J zgv|XPe1nV}t}Fku%oSQ-gc&%JsXIDcbN=BqYvE)P;+g)*xpHqtXE4zZzkNcuG3UZR z%{&Y8hYyk$Fp#O6B+qdc@GL_&;&v43QAW-qi$e?ml)-!$gNNh!$>iRN*C$)?bsm`l6G^AIw;VUVF|_X_QBifLM=;@Uqo ztOv^Tg!J1R=CvNseD6Mu*7Nhx5tF#Te)t3vrrak4Bxf6HA$57n9mhP`AZsOK9Hh}WgN#aw;)FnWbhSUu5J&u>|0^${HWl(Q10N6q>x7}byO zehR|_ip)PckEzD!z@bfMr_6h5idJ}L06@K62j{tu+4~di>52XdIng#~M6`Jr0L*g& zgPbyuQDatv%zmxF?qEYaH~`W-Iiub(Rt1$BZh1XoR)kT__m4TV5gamrIHdpVgAkod zWYjWz2M}yg9#i-j@6kuR6PbmCPcRpUAX5l3yUki&&3~lh-2=3H&VH~StFqRzIx+Vy9qY`s-+Ov)_;3Wc^Z%g}@2dETCn8nlmPT2uFN}7@}N|>6aN?Lk3Z~2&x zN2#^F9L{L)Df3a|6fSq(afdPCSgJJnm9PoFgWUm6<9iUeNz-YKAb5ICeXG)i0wEy* zgK^M3fQSsDQZU47WqFlE`~f&B2my7)Bd7{bzOJC~f&nYQsxo#u8$#~v_l2YhOe%^otr zA7yZFTnS}UXu=Y{f-4$|EkPs-M;NYNfl~$x>9oLOFuxT}Kh95mVsP>ZBXZN?1CG0L zd%hQhgqr3Xb~Es-yc-S`wjDhi&C}O472o2pqlw=7yyEnA^VGxho{hcVzJ1R#?Raq# zAt6IjOL}+lcJ%AV4>;Y_nR%^AMH65kArt!aNnyicXXip;xO*_-zy9^F?1;jka2R|z zI#&27m>$NRI8UMd zWKA6SR+y+Q`>i-I2%j)no(Bs%AiDi0CvITkp0cf&n4GDv%b4&3O$_7%UD8LbRlw!;;@A@pVav(GB!TfY*_Fg;*$j#TDZ^Ow*mjMLx5lw%MqtpY-e{3iFz8<}rx)1SKZQ8M}T7W!KOd1e(hkI&|IB>E4*KH0@@N(56 z;0g7%d(O_4yrpegSZ=PCYTwana)G1N3*Wk|#N(>Y&pozGVFKMU@S8DMd163mAJp44 zYaSzc;SD%y?P2Ck8;~J_y2yXz%|Q+cs7BF5VD)>r6$8!} zHZB>>uSO>m=Bjb5QA4ITGr*-D2s{O0(-9w8)xdADvaS?GUK@CzEuH)V2iF2cI1nU} zasV>G{({gYG7<#NK)k(PE=nQ3Nxr7BAiuM&)|(XEO9!U$lnVbPds7ReD6sIIAWYwe z-;3)s^?eJ_;(@|zfRgdx8!Bohj=KDy)(w)v!mKDn9#>-!sfMADvkGPtA;~v^i~KZ8 zX`s|?IA>y!wkl15eoMm4Wl^rzDx(;y=XDvnLL#x?sYY|OVw^@(ktq>s4$K~vmP%0t z6?u>*`4i&^NELm|(LQ=ar6Cbqxi>2tjra-7IBf)j&Lk^T9idK%Hd;nYs9%~V_Ggbc z%RJyU`pj=KdJhxV8&18(Jw+$X%ef)%x<@k<>)Jm@GYSx$Uogd*Quiu;^KyH9*29rY&l9_Aw zgeT59(9}NZeE#_13mb?t3P)Q|2&&1QFjuLCW$B3pz@f8-br)x+m|xHEeEjg?Ll&7o zGwQe946W6BRS?-Wwx#a&3T6Q_JMl^ z&cwBvm%(!P&<>?7nZ0f8dw=`^C*pC#X~~X6;l1`{G%aXtN}dkP99-oHsAp)LO+L=) zt84n~l0kz@lqNXdv_@#z%?G@vu>7Sdf^RKLH3wMyN#Ba*9o8udlDu4jmtgtOD)_c$ z#un!yA7VDCawEf)hAX!CP~o!btk4G{qJ&DmAFhU6N$M|b}Kp;Saga(+Qr>ncFGBa|Ceer$adEVnUGG=LR zriWj@%USH$vF(`IDQ)n1vvwFNQIL}NAz%s^5<@3ZBP><%}2!%Ls;oSdd!+)VYNWSf*~pTfYpFh?~98&xn+My3V~Ji$55);egIrDw_S19sIACg+5GXz~l82Tnce zKSta1sK-!-DHE#4udDeH+>lxMp5yGfOwDJ7cMX5Peb0~2I!-f~l+SywzUDiYsQ{q1 zVtk^%ogW=EuEWD42zjge@ctv)BALNO?F$Dj#>-t&gr{K*;^CMqE^g1|^1~L)R5+NV zU0igGmIyW(Yv-Q0!AA{77#UR{;0_ToEZcH({Xl5O zb#)IeNn3lUSZXK=4qG^2ttMD75ST2xOTq)kL(NcFYuZ)NOo~Gm=@iNg19A-9;97X< zkmfV?+3{){dl zEnZq!Iz3>}Bpwqc%*sFTO2Pc`u%Csl*0|?Y1rM4>L5_-4115-YV%S$I)uag?m@C*a za!5}Zx7r$)WiINgGssA@ZJ~$bn)kJ?g&Ed3EPrs0Nz0|zK1@CI&-Rs_dpHlF_g1Of z@A};G|FPrgeFf~t!)84m5vU|g5;Z3}2ex}#qEwZ}B5_%5G$%DH&xIBM@%!y#yg+_g(^372}CA68X0e-j?z9gCJ@MW`kvV1 zUf0P4x|C z(IYgRcvvEh%~#iq5=6{az%*Rfk-*E;!7aWa?l3}`%?P6G#BxFiclQT$l8f6;POlGi zmxkbKB2;@U6R!|MUdc1|({lVS@6)$1BkE_C$N)uYO)(h`fblpM_Eg|-6nGWyMTxWH z=p^;N-)a#u!-o-@-a1jJuYQL|(-!BpZP28m#%(9~3BbKZBY+IUWXAMBQ-<|7!GW$Y6>IY1MVsan6*i7f)tPft&{ zHYNc9Yn5mb9fS&*zv<>QPnr$N>@a4$84$lG9>@&rm+8k0eK9X-($_Jqz?^7mj;U?6 z?H*bf%!DHT>-`&{i?#=MnIq!9IcObU+aK!@&+m}dPQk@K7#4kp$y={y9aB7H$O9co znAzLgCN3wY6MXTy4BU_<*B^!T4$NM~f+x9`~>65TPr3 zT!K%&s~?0}il$fq)Q)9veHf~1)NW8LBj08H*zwQ=oq5N(b3Z$`Fo*4HX&d7$UNdH; zub5$VijvqXxNkH^p9d6N2e8f#3X_g#wsl>8YA#it^)=VkCNe@bRF-%aGtA{CG-q$m z9^R%i+p_WSc0yWj{h{!3?u4aI{_t#iKv~Q=+rU-l=i@tG;INJL$9Fv!x>^r~zlrq0 z1Rv#X=`{4pfA)#{ML@Toz9XTqOz%+_6?2D*InVV{X{n>sU7j!3h36l;=X27kKXxF? zdX$Au&tl5512lnRxne_<+Dj$TQhbmnJOoS`(82@@6DpsJ?@d6S^3?i+ilXNz} zIj8@&z;3&C3Ye6oF8y*XG^|Kx-$BX}>im}trBL3t8jB`c~y znu2)I#b|@HHu)DJ3R-|90%||C$}Yh$-mi{_G6RQMY9v;oKoTU&fB@7OiP*{JfJ=~S zVk5!vyoZFWDOY&-T%KieMIxeIb#7PtTbCm&>PcB9J);3}R?`!EBw`Y2zvJb(5m=m% z5~wbSD)E$f&5&$uho&M^iv_L_rMi42aXlfI?lcefC6!hBQ`)S#$ua>TFe$0IvW5hb z%gFky<(k?pQ-t!D5Mq&7cu0&#B+)*E2^_Jub^m~AOKk`T4hQ3oB+(CO48{pc5Y;Gb ztIS^pujid+Y#H1n$-R#O%qTM|&LXuFmGJ8lE>JVZngQBAH3|~}SccavyB=S^JwgZ&_8ddor)R2+ zSzIvDfP#o{u#Y>ZB$`IJa9r=n%wt^S7WlM-qm=I^Wgg61^QeT#eJCYv#!?E49^RU9 z0)nw_4=@u`hfHLI6PRmLh_#HP>u{Lpz;_Q58@QJ4d-r_mI8xg$W3?WG^ks;20{D=z zg=Lcin372k%)aEj(5rciMA-@#_Enk{8iL?>&)VS>=Noy63GB7>Xm&MrR~YC?tOhp6 zamwwwCgAca+74yHNX-++vOxd9OT!RIN0E843_)`c5^}=9+RBDF4Z-4WS?;%y;dB{bO zNaV5{7U|Kn4)Hl)>8JYsVQ$zgK|y=2$Rve*4l0mHql3>q`g|z;swRplK7X* z8ceFDreXS5;`L-8%zK~VUKW?Z7_<4izL_M<6eL5_r>9oI`>g1T5P-Ru{bcq6Nb|En!)kf1QA@nCVJn0q*?1tF@g}5vW2;s?*FM~% zTqY#S7@aI>TX?qXitTkha;LzS^gfeY+ zUl-1EG!FN391+_oUfVC*X?qy-FxwHZaGE>Lj%yJHi?&z<&(bgZ!qCI)z&&8P1LHkC zIYJvJs|x0G1qsAR`i#wk@`YI)tEV^SHfzx-8&B3D=2D8IEjqF|pRj-d?=f>tQ}V+- zn@}SxNr`%_D{tc|>%+oqr?(U4qUkc(n`l!D8qvb!E{^mNShNI4;LXY<9t_Eus(Jke zuVtE^uo36LN+AOJrjTEf99T^e5)?!NE9%jcJoB0PA710&atKc`LT2M(dA{Ry>60;z z$qDRJ(lO?;IaW=5*us&f<2ox6`W7kNb`aJ_qq0`7KZJCF*6^mZ&yUnsnq02SygZNJ z2lPKr)w!wZTi&6wj%_?YZII(9;B#Mk&RFuVrr+KQ&6g(BN0=aU7QuU|`PK4hLTL-< z?$Q#*OZyn}r$_4I!r%X{pDBH*f0h0``L*e5!CQ6*p>PQeowj={vV47(mfIPs+Wb>W zD1*Z5TnCkS#=&vmMN;GR{HNAXANAY$hEgh-(TX6m-*#IDNCDL2Pk!g5lmMwt`QE28 zE(W3i*gFzJpYu9IMr5*0Da%3%;YnBs9=M~c9(z)*6%_PU?#Lf0@omnLG%tH1>x;KU53%9 zb-^A36aGBD?;46nBz_2o?X`T(X__d7McEzvYrXb?l2fnQQatR#fOQ^DfInsQn$nVf zU0s@z4I&GpKOoQO$;n|gX4iD{R$deO&?a8+#mjGD3fB-Zm^o%K`zOrqV3y_~RUo;# zB$@g?Qag-#4r4R#Xi4j3j35M=ciQaAV!!J3Q5lT=x1E|954KOh2Z=aMH3(Rp;3EsM|4?I?F(1%4-;7 zoLQW1jF~uNAir9n{mW+2yi)qd*r^pV?oN5Paxy4=4t@nMXrFU0cn^$Z2Aclj4GK;k z9_?0d-n;}iNPtdQkKqYgD%8}~xYmTWC{TNpbwSMez@Z`wjqB}}C&~#2wQ)7m+Xv^> z0tssC zZdedaG0X=`4gEE3TgWM!hPQfH0-#0q&BPZ!6Gr5_n)wUOWFYx1?UtFk9OFTAxXd-b zb0v@En)G19EpjiOpJ>Wq6^vhAN^?aL%PMo+^4FTq{FX-fP7de?j!#-1^ij#H^no`E zQ}hDw_$8mJ4`Cvn`CY@O{`R^@{oC_$%{ECBz3&*6Z?CoX-u{dKux39rpTVQevAVEf|x%LORw9-Uzs8QW#LQ;Yx*w{0wuqhFYWq6gU=rskL}5+L4fu=Z$bM~+}CPjPO6M7zd>@>bH}|x$jpgq7=xyo zq^o3%doZu&7J>kE9^jSOMEjb;WMps?6J6t+^@X)nF-=pL<~l|f!h*&GVPKk9^Lw-x z=7`$B5L29Mp7vjJr_MHaX2=;6OV=4fv`3^O`^Y?M@$5dPGuG*z!LWFCg^F>-`qw2y z?|}Hd=ahAf*Wev7gdayYRgWDM94CxY(Y()ac4@)Lc{D=K&!32QU39CH(`Qwe^mU*(;uL1nJMKH$q8<6@#bWG?ey6peZuOnW*rv> z;r2=gtbOgFE$sj!_of`tA7f0f+4B+aC9?ON5VJb1E@|_{#U1Ob;O7$IO<@-e*fy!X zNtG3J6++EG^MDy!+;d)lu$09kOds^N{9CofuW9DdpML)h=l&c6<)r!~7VVA?v3{hwkMF z&9Dv7z8P~~MzF=MBopT4RC6Qc8pGDCmSaDEyCZd_#;AM;c*V^_fm)4fh^$;k|y8}64%IGK#cB@W{tjjbKw5TtX8NgYgv zps9G7@u0KddYB`Fv!V1n!)4l=-7px|D0B4Bc0ybNd+EIC@8Yxw4YHij%sR$;Nz4>|Kn5x4J<*2bWZH`z$H0f8x6wiA`eC^zAchY zAtmtw&+e@;cjFj!wu5TM1DG`&_B^aC8$mFD*_=V;6bKW z1acoBRlVJBRBsP)wI?II0r)Ezf|(wyPpIf9qBJJp`58F={WeDu;-QzR7p=?pg>=3_=(;{Nwff_8O5Co!lwHx$HbBBK zT>4{Knvc{lL>&XV;kkB<=Sn>??Sdyh&n+gZ8D;eHH1m+-(SfM%xy=sDDBf|j`7;u; zOmRp^gc)EoVL_jPAAY$IINL5`)QfNrZO^qWy$_A?b6>UyAN0G4cKGb{W%{mw^y446 z&m`XN6J|l%-n==5S+cDVZ1uqjNBa&iXKDiVcN^i!NkpO`(sn@zs8|AG$i))8-8QWl z_slih0#=T%-nlL_yKbRoet_qt1aQfgI*+DM7cHH12o%nh@4oxK`kTN0Z8U@#JJ;*g zs3|dy15^-gGS7l{jEh>}&Q94OW4Onf7UN(-XSFTyK~GuX-cTzg(A#l#jMXgE*3?qH zZ+i}5Qm)C#AY>qF9cG=mK*&+!Uy-Qb=H@J#r8!fZlF3YTv!bEiW4=_-Yr`Zb%%Os>;tW`YAf_N8=~J5({vP(boPkHu z4mlZzZFcQa6RywLKi6p0s!Uc93jjip&v^(3;Rhn6-WKzGn@|_co_aH?rJWNGd38gs z)D~&^z^|R*Aq)axk3K0NW+w@X8&PhDm|^S9x+d_{qg74Xc~j@(O(H=3v+DNLKRM!o35K@cO3E8d9FQ|!+t$I9)C+K zGG2@r&(!U5Faw6iQMC-2v^4MUj(aKB@~Mx19(DOX|NlE8AV~jhhyQJ7{Q-xbzU{rI zzipuZnBk9AJbk7eSA1^OjVJ(CMu*#5I0YmQPVSDK7iB)z)J44KqQ+A`NYx=D#Cnb7mUhTEBqT^iawE-gT;GNfo^(gmo84vg{c*2)hUv^;RfJ>0 zC(x*n)Z_vt6{^k5G&DOci=G7Ub0gyXlFKxYbNk zLN6m+VoHSTN4x2ujixUIvE$TExxx~H%tsB>erswYu|~B698Y%+st=z&SLYDr1)6fl zpmgHGCg8>aTcL09j_aYBgg{4gvXbveVoAz2%|(SFV9GPp0*Tgy-bXMZ<0ps20Divw zT+I-C2CVOl$;dHb)7NW=pKCfJ#;=1{U>|0_fM~h4dxyv8!Nzf>3r@5(*}-T#q-2vo zDHM0Kevq+)Zs9P6r0ofWc#cU?ZBRIC)sPUy^bLa_=prA~2PzPtvkwI6LpT-4B+|lI zbEnQdhHuPaMs9CZ)(SOsqlG|h9goDOVcp2i*tJaqdNOUk_Eoq_;?B< ze|CI8{p`f@;yFx!@C@L0OEPpBl@=nUcr6zIh_(s~;Y9HeYR{Ln)g=Q3q*#SALqMa@ zfI>^e{~f$=Wx6^|*{=>-s$mo!G7;e}Ol9zH?S+T$!tjMMnVo- z@#xLlmt@fauSu$5@^#BH97Y;o-T93*#xjMS%nsW|e(Ra4Npg!=)ZjtQfGERpre|cs zxvB1MB>Xx?;i=5nSgzx;9GQ-7LhK*H9>U^`PYOtD(Qma{HGHO&H0(&fwo)CXfZZ&h-Ux+$yw2|1GZM2%kh-@;g z>Q_gD>h<2DI%F%RF6ozaOLlFL&Bua_396^Ogn)nmPDDdg)R1K?wyz9Y>4Pxww-YR5 z&%5<~e~aIOB(QU!F+bD{syrvmDHEyO1lK7KVlMJJIZFS41p`iACWcJ3xG&Y6M{2nI`;|e>6cw}O7IwIhG%$7c1SOYsD_RsfZ z;I2)$F>n{$T{G@27+N3g%{8SN$&EF?x%sfLyl36k=XTvc4~=$?K;Rf^+ST;vn3#@D zW@XAZokY&hFG9Gl2|%|$YQmpBou!W^jaOTfpgX?8Re@5onMBn!6HTjn6~e~?3yG-& zO;225BTU3E1t-f=gS4EqhxxRHIq&xN8u-zEV&g`Hk{EIj?@oxWUX{-Xr}+5s1MiX^ z4o#{Lk=D}^M8FhEo>hdVBwV1MCTo9od_wxXUiJI4pQ9P-#H7HYwZM6yIhR?)Oj8&Y zDtziWK-;{gH>Jd%%Q+BdgS$0-QK;Afrn{K5doZOvOqH5!4W$VFQJ1i=&-TGY37Sxy zA7%*>5BFHlGd9qAWY$-#p^jjLeeUn>15kvy2LuweXlakyn=qY&FA++BnOdLY;nrqe zbG&`V^3Acj5rA~cL)%MM02B_wV*s|Y zOOzND28t54nb0Yzv}1Ex+T#!2apMM`msi*(>(_F^e?Im>!GXG@?cDdA)~6^H1CR8v z^epGXsdhHY1ApXCQN9$ogms~_ffeNo4Z-N4@E(}bHtA2C6RBDuweW-|{oC*n1o~ov zNda~QWJu$mbbwM*hy`(*!-^y-g+Z!Cmdge3WdI5R4RPL>*#bZSPiyk=xpD}o4S<7C zUmNNZ0r2KoJv3uJ1b6}X2FNrpgB}me6f0qo(8%mSiVCv{LN_Z8oNf{3)#KcJbc1l>$uMDV?YKYecfz!@% zF5xgRH^>UX6Zs4?@V%lHxalnn4lO~gPZM^TOa)%TN?5ptAnYa%H1EK#HN4(3J`yk5!r0pm=bszm z_Wkhu4n%51yWe5nydx~a_2mW=u!FhUb&f;U0gv`ONe|V>DM$}GW2+1;a5Ag$IvI8B zP@@fcbFGDkWHO6DlqL;B7u*d5w|@xG5#bEO&R+GmKN5bxn&bfHxPy}eyCqdk)(a(M zP}F>;z*f`j82DbJrM)Dbo95UNgr5SdYn)tq6V{SoR5GjU5o=tm3GUN3Cw>cNuuC7# zKDd1oW<&ZbgOWLsDw-Udzd$TyenZ^!`w8w>!w}w%xlSDmG*4su?1SEi3MCR=Q-a0Z zM?Df%uZgG8QV=ZM9!Q5H1v%?gI}}&)4s{o86zc`;(wRhUcW-Z})Wi3|{xMAYk}~wB z#S}{&GCcbk;tfuDoSmIj7gyJ;gAUOMaV~-x^vJ+sO0zBCC=*0j@L1{N^RTYJ>K&?ehl+|I& zcQ%hmi;D798dsjN4!ihR*JFYI@I*S~yDRIG>hZ4lB=fUg8EQG-l(%WWy$a`{qNnXj z-J5C%1v8X@!g$C}vG2=hT&OIZ*8x(?vU1m$(rBfbR3uQo0#ISV=aj%PUT?6AZI_a`gwt84+jEgBkkBB!rR`{-Fe&8LP2V8C zJZ`3n4*3ZiYn>qM!xYoeZFSVWulC8<@a@jLI^9LmWbs|5r>nn^98xZTHqszNeoUwkH zfWRRA$4u^fbNfd7l~9Y21i|Op*~O>oy$%9ks3ue;;4K)|8ZWxOSur3$JLZoBZ1;F_ z-fOmnu(+PwLPONq%ymeG7;|Krv|DEzy=jH?JwgAbZrdH;S$d5#2MpVU(uTLJ*(Pg7 zqV5?c*#Y%_`1BEnlZWb%T_m<3+TZLRRKMWxVF<(+ZEvvsqUr)`C3pn^&9o0N?=Dim zIc4W)O>@?X^&nkyPdE%QmjXGM4Q~2qa>C0sK-W5t_YbO{&#tRIG!Pjg!xcth;P&b1 zX#(&aLz$1vQ0>B_W=6^X$UEjPok6&VYzOAOtgG^#jNP?T8Io0U z=dT&3qQxE@5HIPv5ir`uOzoVzX2*v;!YGc8j$^`oxI1U<@R<42toG6FHA8-3U2wrV zu8BB)`S4Kv?hiOJW$hEE7JLizD%CtLKFCz&SWT=yA8Rt&a@oT7uWxXadH76QmT?X; z>(A*4@JP6Ooa)ZXk0hd94>=aXqX|`V?YmSPJ5)$jJdet46n0()eW!@ zf9H@1(Wd%HANk=GNg<;U`Wy|+S2vGJ>s1(P`sEFa{@S-v;yppnp4{FwJbW% z4d0a>S#4<-XL-RZcGFfAeB;SHlj}U=oNgQLkWo4%Ta$*V2Gkj#KHhN z6HGux4du->6DNF-cLj)LM}y=!wTU!{?*asC5GWg_OJ$KFt(j*Yk94T~auUh}trIjv z8ggHZYa;25h_2yRBYqjjJOZW?t?h zWp*hSuP%vI)+5|6OvFO6D$JXH%0fU&+wY)IAoaqSWono*!$4?qJ&|m^ZtN|zmNNNd zBBgDb#)N^J(XR3SibjTXFEjL631CKpKYEZ^zA4P=IxJhby6#pZQ!QO)t&%cC0?nWq z58COwKC2g2hx=;!awuKf-MN9=aa^(e61-@`_7&uC8y_{u1`OSecAe-H#@YuH95^ef zi5~;Auu$F=-$XsphM#3&UA@ri+9U7W# z9^jQ}MiSS2uGzk4Ost?ng_F30Ccg)h+QA9p7L(~M0u25h$y#%Orq)q_17|epwm|$Y z4b4~xU*2znyXMX{U|ExGrv>9>J>`UW!4A*P5=@N;;sLo#N5w1GHr|jkRn7Rti&xc$ z^Af=BnxG8D)Ng8JuU@?fV{Ble0$Eb8%oI8qt!_+00SOjJ8p5UqSH@oL#gKe>k-6o z*^PkA8)<{>aH`jR&DLAIzr%Q$(ohWm)fsB zWGTaT$#A59#bZoPjrb=f@`My!!FUUZBo1@(4 zZ9B`cPJOhEHmdnCtxGl3s#G9xF48fY1b~xS86%|TsG|#(IexpYL1O04b+tcyU_)NE zU}8u5BM91%1#)*fz(#{qtjCxMf9WF$mRmU2wAnK)8kNWg2H0Nt2p!7DcGen~?G;{i zpG5vH@n=C0o^wD$04cyM7iui5lI0zr6|T9TUQiuX$Q-=qq_S*}TEOsGrDlbYdYr7g zHn%wm^(6BM)1wRGwrhWCqh`VAk!)G5O_Q!&bP}5tB>U>o4o#TWA1^fUP68ZeNc)W` zyTbKe?Q{;anXy(g!Et2?4EGLY0&LKVK~Zh+?ED6Eo$GV1H<2z4K}2V+TS6aNm;;4j z;6|r!S@V;CNt7s*@?e6jeJ(K-Jxpjj?QY@;+G*TZe{u3ps~g(!V-v?2wq?>B+#-SV zlwhmBWqT|gJ@#0WiZ>r?N^nFRd|g>aWCG%~=jL>Gwc$Rf&*JU)x7Tmzw_S2`-_5Atsl=FIGcJO26Im+Ba5W6syxo6G8lAAUfBmFJGJ(?>*9VAb?`dQ2=PC5RU~ z{}}S*b#Y$Ct(jMovjU8olIBYpq01S~&Q7&=01eP22z{`8*A`99=h`NUYue%dm6kE* zy{y4v;*}Z70M$et8{hSi*)51a_PVB65V&d*;)2*1x|H!?JZ}&}RtO1Y&X#&ynvqdT z4;4xja-3Jz<9i4DhZrgG-o`>@#wP3ZehoA0f24iV4EYTI>ce~f6SjVq1lJpwZ(j{3 zGvHnmy=?-*)Pd;<>zZqa&PE%iU?44aV*#4b*5)1@kp1_EHC!c9SxxDqX9M7$z9Mo#HJp1$+ z`CaSqyMOy1B58;?JRR5QnCNJ@hzwm2#Ip@m#?=X?H2ySmuUxRNvJE*H{1gmXa zO+dk*g;_NF5iX(3d`4^92U4|I3uRhD*lAz3^3mUueeD{bV1oD6v#n9}Cx?yd*Sq8( zWKn&99ep3^c*Z8YdYUdUkLejJvFm`$t~KEr8S{|o(TbGFLuZdne252C1}*deS;NVN6|@ zRl9*`gDW$frUp2iIKCLVs(S>YPk0e_$X7a~{og!$mP{)X0wSLg=QrGeup)`yj+ST? z#I$WgJnRkl^MD8E)%>P<_58RxL~!|haYlqr2S=K9b;X#CV8R2K+JyDQ8v^9VIL#PV zGKO%kz_Zui9>Vw@SU(i^(XQ?k4`jWU<;lYKD)g8|KrYpIz|c zh&5B4kMz*oLtq)Oj;uHNWJZqE9%IdthHKUeyavH{G0Qd)UfeeA2*D`K5aG`Gb$fkF zxC>gUre&TpJ`#x!`oa6aAYPbg4G*+qgchy<)2Hofl}?yB^X3-w^9;B{gqY(g% zHGP%-$Ctz>py^SV__m?qL+BfQ5I^Qv+VpN!D-9puT9&&QJB7YK_Stl{d|43lJB(NQ zjH0!MZW9~FH?YPRB-T9667E7<&2VFMgqA}UD`Or@J9YnpgHs|O$^f7VUgtdF5CBC4 z5YXYgK1AIneU3ap!MwpWItUPp($3E?!Hkdv`Btv+mxg$~)RiYTgIIHEl`>jMB@7@4 z>UkOFB8i$0lG(~bv@PNZQiqJyg~Z4VoyIr5Hpq3ZM7dBVO#+);D=DSW+Qx* z@?87!cO*CZ5{DkHOR&@sy$C3WPUm`sx@NWpQ7lX5;O4h#4ocg1Fu^`Mip)9RXH9GeW-*5FKR}39 ztergEq487S45IBu$qk6Qgl>!V%o&Vl0i(Ug`*IEr?eCNS@-spe#CwbbiJFzDDbw!Z zC97F!$QqnxT?5KLeYvc*3F#=~UU0#!jULcIyHi3Sc+N~VBb;1(Moma_r&@W5aV1*_ z$qJO@9Zxky@B6G~P?LTubO=vjtfuUJ*Sgd?)S9-@-ir2Uh85P&2*x+pszk>C@K>*X zg$8pCgT&*Nj7q}Iw*UOgZ_yyHf$#gz!fd=Ff6<=Wxie)ab4H^9*_25=VwXu7&>`adD3rhOJxD^rWP zlLPfgKj51PUou(hp*oikvS}}7$6fl;hnPA@;+k5HVL?0uUsPDTC11csyMvILN7fB< zjbEK%Ry9k|7BQ|(tVF_?0Rv`;!O(&M_%{;=^f+c7XnoRo%6957mw62HSwowO^O|i& zRAoLE-3hA<^eBnQX?K~U<^6gN({OMd_OqEU=_4@XKji{z4igAit_Kt%-#Oo0i?zaa zLY&JM(6J=q03Hc`rwnmxjZnA%)@uaUCZT3M`oJPV1ZA^6sc4vUxv9V&#wG)y9nxFi zZGTD|m_OF*JxYjhFX05Q?NdGOkL{x$I=9q3puV1d$N>4L5b(#2lm{)#5x(Uaak+{MBeKmwQ?3uHV>m3Fz89i{yn1CQ{ z8JB>eK6(~FhWFDKcdo7h7m3kloDfPJOmKmo^$6;9G2e;c^O`LZ69}BV7D5LD<5#G~=}4&!WRb{Oe`$-LXYn6`BBHBZDA`KDJtWjI6>gZM6SWj8LW@Xc zLOKDH{a*^Ah99eO#!*%1=+>Jf)NsNzLWe+dTtZ#sCGGEXc=3QWE zOq%8B`Diwn?E%grFi(l}qFd?l8 zrZ+=}Oki)DjchUbdfbv~Z8m{0V-6ei?yHw*jxrPl22*>rX=4`?=a^mXb*Nb_G_kJY zF}g;3bq&i5AQtBsti($ki*{MB5_Tgj26PWWtau~J;5;O5GDbh*&Nf9q+W&L$a=0n&4z>TK9 zg~`u-7=8Cv4_^8=?6MIu5ejp%>NL>aduaDl*Xz`JR>tEhX*=(!jegbV;=G5rn>l&Z zW{vVV%FJgc?ZrZh<029VvNC%2r+wDMLb+T9iu^+0ZG`1zd8gB$h~?) zIK_hX-wvAJ0O4R{mKU@I@rYs>Gd-)BLyU!4suc1@w7&(j(pyy_!}e=>-9k{3=JgaP zK$+U?!th-~ zbdDC&Vu4?o<7)(iwOcgtUf{_$KOz)JDe{3?nmvmlNF6*-7@@S7xnLYIVjnmTu9Kjm z&9XrkjU3g~DF`_z=@gmPLYZ>3aG}L9-%NkmUK?+^X@hlhUA%H*0t;A&KwGyo*fDqH z%AqNC1#O_`k~ofn6Dd!62+{Dp`VdAQ^|$Ayc`Qe{XB(wg_2E9OIjEq9u`MV*Ez*VZ ztoI)8Z~B9FD^Yb4IyhFq!*rr7ZE}uD2hzcH84W*W3Y(X0f81DkCIt&k7h^emUj)=4 zrevw{njI?)#eUY^E`Z5v)CEAe<2}nvdjPQJNH@W3BJrd=3M+N;i01;H@0eSicnAy)QTYWlGoS&%v$Zn)cwpHo z>Ja(;cnFii5CIB3@V>-N*v8cCZ$5?yICwRou>Lp%KsY=s-*qGjrY0H7)q^*?Xv6Hv z?iOlGnt}_FkV80Wd{)@hj8Kz>iH5~IHBHM@I+6ew6Ir*pLnd) zj7RdBiEi64OEm@^ER6NCUUzuc$S~!-71|R66I^Kn$SKUmT%;|szYOsJ9gp$Q$ha~- zv`ysKb8`)|G8NM;u%=w7CdIsOfc^QBGx1!;NW-*$D0ws=}Xp!E{PHB z5o)6q#2p%(bS=!bGEW2eyKkRi`o-*qmS@_!C9#mkHV#;Gl~IjgF2=hJ_l%wFvnjA) z3}#EgJf}8>fMBK-6P4fM=(2lsz__r!byt|5xF92x8Hr<>)x;mY9R2r`1jFRh_CMNjR_pjN~X;7ViVvU#i@Z!}W8sDqx z-KYOWU(f)L*wG!+@a5&_YDqSiIm;BTIJAM?7K~vGb8NDc`oVK{z92>24e8GCKFOSP zUWylmkV{tz@w89IPfjuO${_TptpZa71Nz}E@~)q?Nwud&X8(=-jLc5o?NbW}B>ZG!n>_IyKSPb5OXtb(M!EdoYBwa64%9gzV6E;o#USOo%7; z$#R8@`0C-9@*~$g=ayH2nbV}e(JQtAVjHWF^WAb3xSzsS-vNnzG@z8hIoAqZFQsIA zG_oXe-lEzEB zJ#2q{*hUY_vM_(iRs8F{5~c_3;6_o&HqWN~yy>63Z_3U3h!c)Kp4Nq?UmsRm*Ij={ zyX66!QeO0B`vu;`JCt^1C;^=5#sWM_iZ-%gGOdj!f|6}1($`evuIf>J1%w^dmco&z zAXJ83n04IP7Z0Ta?-s!1(&piEUZf)lJ3!rZMq9ceAWiJspaW$ohf$Ah@B<-hAdy8| z#Bo9iv$+^odt_~Ybx2Az7~$a-k|DF)>bsa(B0(dqnMYBLvWv+Jo}QtE--bwv3?iz@ zpoNA1o=PE`)^8f_UCJ@JG>8-==T0r@6yz;yT}}oki$qgq=)`ca{HWP^-^1UQQ@`u? zjIzBh0f2&}ZC=-_Pp?eaocuc)p`Fn~)c}5K+z=C8yqWBEoFnasn|NxZ|BfSAnQxgk z>n(HOWQL3|Lzs!?Rn0v*HmI3AC_n%swRiqU^J4_LM!RT#gKQX%U5`2|<2!lY!@RMs zWx3Y1fZ1ABkL`M7);jITupeL^2$PH#rYvw%jmj~vJ!*x8M9kerG#$2;TX<$0CNxJd z`;6AJg((vKn|v5L=`JQz%i0 zsJ6*;1fjgYzl|2R1JjyNr%o+03QeRkKtE=%krBu|)c9nOrbGM9Z+;U;4=n=Xk+7Js zW@QGS=W35+IB_h`KHz9`eqFtK@e(b`-5tnNiubNe*!>8fJwHqeyn7m}H)6Yqh6PM- znGl*P^;*>e^z%<&5|g>lRz(a1yVT<`sWm{y3(A?`gj9!F6(U-Qo%mVLhbal}CDvLR z?9cX4O%_8wc-X~+y32N3YOi`P`;5uG#S;Y}&?Iw48Zl#x^(c-b5`8g`tyY9F%OicY zRT$;@m#YXq&~OAA7&!14Zs8dW9_l4-Ru&nixbB=$+jLsVB)Vixk_BeTgt{FQg+A+c zdfHxv7X=>A?W5)B%;Rs*y;cN1@E=@OTO{H>_rnZnm{jBGJb$DGz$o+vI#(EwGX|;$ zO_Gw9og@m4;BOcSfJ|A!-Zrq6CkONcbFY+*r*NN8s4LDuE#`FtAB*;aJiIW&uG%4Z zCOwyK6|0~`SPKv(`Db&4>G_OFIjAr6oO`}!f2=p_ggN)OZFq7(TfF77g?X2IHJ*Ge zue?|PHp5PR?i=O2@SgmZ-lWbNHl^J9Z#3BasM}-PN_*QW%+AP-g`I(c#4ADusCjiM<1nvF#$g^=k(4o{XZbWja6w zCNemmaiBF@`d-oe%6gga#YDy*Gp~5?D3h&ZknlZ;n#@yT>MjXhGd3}>lUSfRn+YQ3 z6_FOW3uW6Q%2FYPYDyD<3cN+wVvgYn%Jqmd4;ol8R$)+K9EABovnepql&MpIDW7Jx z3HbZrF5{*4i-v|axkSJ)$X!#`2nN$Z14#SnllPRsw_ytCS|J)TIt8i0-Y(CQqD*E@ zf2XYD;_@6B#0BqLT-Jr38FE}N3ZdIb=XaP&mk(&32t<1)INz{t2oS61FJ4y*w{n8n z49NjHVbfCu7R_R14UfI#FlFxUiDy*KTKHh=5JBL9Shcbi>u&JBe0rBPRdMKyMBY0j z{2~j8dOdo+Py3DcE1@3tbqL{g zTogFOCpAZzpbXG&nY>Ierqax{Ms}k(Il;_HABBe+pNH9VUcY`FCi%br>i+~6wMOW1 zYT)@tyj;~{ZZLDs2_M?WiNzUq{^cg-UUy1Keo}-Hy|t}d&GVbV>+0S6>%jlyHD0si zEWLg|sy@S*(apn@WL`~{A8K5;T`~l}*~-)nIZ$xW8X|+r z`~tT+0IGu*@6z|_&mEe(eGpk(Gj>;#0oIbylvHa94tPClzE@y#E@gfLpF7rt*JK%5 z5USE445xwM>v@$kY^S7J-E~OzHwpn3Ki`sN!niCh@bJI3E zZua|%yr^pIj;YrjL+kVXIJRV#7J*k7X?|50RHO6x0z(RBjB@avN1@LJ)^T>>a;7zk zzyg|OG7M?bf>14YtZ>XdR`gpBX#i6CPg_EDRs^}e(iMav-!&Bu6UjQ<| zr*w)=JF#kFN}Ulo}UA@_#vk@<*q7}$V;A|7kp^xOF=TlF!E?S~e zjoZPP-9z)LYf&YpF0xk;)65hO1al^X>%eIy^bnXCK;Td#E=}CPr@*ivWN8~M204KN z$YficEWSraQjX_YmjqF2N1If{ADO2fX>O#er<>zu-C0+qeFmz_Jk;_WA5DthS8GZ; zLFhjH*7;Xt@i`}@hi!4;T4^#V**LcjO`BuZ-)yftzB?%laMuHE&ND8=n^nFE5i6KL zzZ^I5f}&?=PddQprK;v)7Lz5g&St>$V*sI@p~36=wrNB`LzXeP9ZIeL!G&|NaX2kf7oDPWAHD zQT5YLpR4vA!RhaQ!oqVJDbh#c|i?^nx@V z*SwW79kp%EfS=jHq79?zVE$j7=;Np zNLM%qChmH(CJT^6(2s{Wp0O1}GGAnB7(;Pp@|n8b4c1rP@OpZw;}60sj7nPL9PeY^ z)I(IE>>irpy5{8t9?8(0eL@rV$dD856ephtw9^Ziq-&tAh3(;}W5@;kB~0K759cxF zPi?*~J-F=RQUWX%0R`_(JjSKz9{L;@sIN1Q7PKXdMbo^5K5LoKOvh*no`r$%jvnZS z7KQnN$Kt(944Q`(47796xT(Xz^=V4yJA(zVWHx~x7CtHWW5V1mXy*%S{ns>tp2_Te_ygr#%$E1ur?z1KXS} zCNekvr(JrE+6LR`M75ooK7GH2yNpoc+C?Lgyn0tgs`#A2?B{uE5IgB z2|5M1_9fxQX$38(P5xJzmP}By@ix-A?bFLwjWY?OL7Odz(HM_5y(A^%GHGKxmy|t+ zX>Ah=Ho)b6!~`~W(6t=APDt2I))X{@%iGT(Mrs1~#fdP6Aex_4M+j8cYI-}a&L$rq zzz|hj$(IkTkDwXs6GtZG44_`(V9_UG_b#TiXl1S?GLi2M+qdKZ06+jqL_t*U7cj${ zge$DcV$ubNX28uYZ#t}NeLVXe@soJCvTKIxmS(3}F0Zn$p<3JJmycPiJ3cips7bZi zwcX8$8KW5*uK7*vcN6$cm`{5Cx%H6aq&88TKE(msmCb?~JBg)ZmE_;R#&gZM)_G10 z;N9({diTp&w8205;X9baXBYvd;j1&AB@i8duYa2FhpaG71p|Fh0xXDmpJBOUuD;^_N9mUb)?;yySt7t3lUe5lTWoFX4US-Y zMNHz&i1lDJatW;U3U`+|lG+dxp&rPFAT^lJRFZzGWyxr#j7J9{$+UN_KTp8-OEkM% z7~;Vp`&43TpQ>5XFU#ho;$aH><+eJiX$6q+6>nDOgQ?*#t1`!hiStYWRk#R~{6;YF z@OKjdz;bHZ;5FgkyM8kRAK~k@`oqgD$+Hue(QN`R2W}qqM=dJz^cS+D)aFk>@O3W=y}m8LiS6IA}r+ z!g*XX<2)K4#0d$(!$LI4i6}PMf%kjfKr{v*i9G?iTstU@#?+w1NgRvNUJ>t+@C*uf z%_^HZ(r%;QJSf4IgZzbiTbFHWby@S9Fbry|Ot1=*C&6w=DZ$>-Jy-7+-icj ztu~S@&%K2Cy~R=H`Q9x!j#&k%t4-UQYL#kJXgNxA=pmTCMzmQ^KAaXH)C(q-8_;Sl z!a2Vz%(Gsk^eke#2#!4jX3D;35D3>UbWYGEIUZ6Vg=4fY8&yJai{zW#91t8d_pTvO zJ4|o`)o*F@?`IcebbBDTFVBn0NGI1W8*EJ>yp)z2G5jB+HB5qCLic2dN$Xo?YwNM{dT1rC$S_ zeT;oIGm*hEt!E6fB!uIYG6T%*inuzOUE&;;%(G@%6&6H@Rs@o6*G zm#*%JH=PllF+XQ)&?t#Ry~X6!T;Y8Ooc{3s3j`2?k9OF`bSpt$KzM%nII6yVOFSM9 zJ7*uS5r)t%_&1(^LEBuhu7-920sYmRV>~c%?Z?5Tfsip_o*DajPYmUntV)KD=mk7M zi)azAs5xy5!Qwfo2<0PKjA>aR#G#Zb7W`(>fb#oYhDlcn0hs%fnVReev4P^MRoNVb02eJhI!DW-wnJ( zm$U~1Gn%}@5mo{Oq5Z8zwZ%C6`1>11hL912)jse^S~=h@L(9q+IOUN8}0ZDxlQk&0X;P0Yo3$NnZZY)Z;vcUGT8|@JXh;Lh&Id6k~rGyYZHAN#ssc_ zJ3TTnIes#zDeIQ@MP?`!%rXYoqew8$%Q^AX;J=P^@M`d!ImmtYd^M5!h`lngseluO zvB^ld&4Y}g?St;dnul-z8f7dRxXmWaiFep=1l&5Wh7;CKyM!?rQ@u9qjF~#qs}%YQ zeUO$Vi9Ll__lm4T)s*|h^t!~M<;Jc0Twd`bBTGs|M%=h@s1BcUl>G=9Q!r@O(lo_E z8S)hQi!{zM&GNKt!Cy9qkAz9k<4{lPaVxmOZ+M5_e!@`8!?Z#R5&{EtahHE!HuS&1 zOGm&`f8jrBvsNP8mtTa_7AeI-CD9^rT@l$y3&LRN5iorykJ?HV3Hwb^E<)?z;|MR zwLZx}IKcd5Qm@hOBAIc)iJ+9F7h1-KvV^^D(NV!3$>`gdLVy;fpt&;X9kY}Htn*DL z%&n;u8V4QLL9(3=?UmptskUJ#65y`z1Kw)R4NPb~f{I-_ILFyS!m;JVpj~t>IV5R` zv`MI-w1l^+#Z90J>VX zXyUrn7>`GHt9Nh41A^}}R%`<_q(9>2f;ArZ>~pQhzI^xg4SiWvfAfFd!4Sj;wIX0j zIch6S!dBkBCxu&QJLPpSNpB5g_B++jxmp z52`=lSYxK9J=Pzmv$E|JfJi%Riyz0|!}WM^TKpGRJPhB7^B2!$!(3uF_2``;h&7;3 z2HQ)-6c!AvkPx3@CYDjE(JkrQ?LGD4Io?a0v7s`Q3tkRzxDYS(2-k$E33iTK9a;5y3mW#$JwJC@9ov#)czXN}A zr2XYIv&WHPn-Ai4YPH|oX#sLY_ z<9*e0r3_w#Fqkz#W~d3EEI?a?0Pv{0E0au4QCmQ3%}a=0NximD^Ig$o+`#jI?SH;| zwyOT**|a($qf7&dB@;?_YLP+-P^6#?iEr%R4ldG~9*o(;F3b<+gLyy`u^N+cZaR@@ zPL#2UKq8ZqxC=qsl9|&`jH|z~!z&O&!DH8G&W@3!k$iV0p zo}g%>!kX1WV2OsS`GmTRIRsD$DU7WXK>}#HC}5*RtK)#punAg@w{~p4(hxupcv{Sv=`UcI&iOb%0L)IYC>L-}M)d)J6L2IWFGupUo zhHHCwcX-4S82|ax6%Hxm>iI75Z^9WOXwvEyWea;_%?@`pvjR6vXXJUq+`5hCNgIL7 z4g~cErXW$3I=arK(~e^xfjop6-mxo&VvMFov$cFYV{H!$%k!6pV2~qopvNk8VR;ZH zW|YyXN=F}QZPI%Imwq2c$gc0^109dhM9GMAMTQwSN&exxH^E_(OkbX}Q^P%Lr0iVr z{ST+rr}v){`*=lS?#oNt+QhV1nDBauS1g8|32hS}Pw=!IvtE0P_O@>Cfm`mDfnNQY z&6-{31;3uX+-I%zxcW>;igAtgQ4@H-J;XKfu%1)Fe}!kpUMq)q4+aFUeO?QK>!ilJ zs?C@nTP^AYp~2YEZRWo*XG_NU8dLZs=4>qs#W@B?7tE682i0u3e{jM&AxQ}?(eg}$ zjgTOYPcV_YUDZf4F+xSt7&}LjdfdKA;n_fZ=P?bXEydZ(Il)h!r`eRFDOLwN$1R@M z;A!%g(mz_lgU;_F96Mj7Q^G^qlKxYWaPqfD4XgUR{`R^iWT}SFsufbb)7F;)-wrf3 z=wsbl`Kt^w=_Hv?Z6C>1&kt(YGQ+$Fq1P1dp1 zL`#LzKF0Fz9_m`sB3sA7xG1F1dD`Jjwu#VWXorXSs(FMHJ`|NF=!X^p+o?J8tK%lm z(my}WU#L`hk3p!fi%+?)5=Ln%CdO-Wk>AjE#tte7yh{BP&Mg7wwEcL!`5|&tp?(4L>h+ zkxthT?d6Oz@IY*uG@Fh!=9s+T0S6rj(B6b?md4c&r;X|vbY}^n){CnNlH!OKfVDsb zV2U)jVU8d+rSPvXcnPw(M@5p_vom{>p_!P!(gl8xm@`Fs+O3A>ybUu0CZdDjaeYoa zcKyx?CKIxJ35I=h!T|daWLuE_a^L>z5vl2_3=&KOX;+vtb{KTcW>c7;V-&)IR98#X zphk$J{RE%0t{TS}1~y65(cpA3R~uI7Y4Gh*rtQ^H%7ttR?HmMif?EC>BBFzgDVa3? zNR-r!WR?SnHPkoetO4%%a|n>qu<61Y430^bJB+hV0S4-uk;VzDrlpzEb;~Ix*%pG0 zxftEXiFrp%9((5@lDf_}L25Usd4)N|>@7<0Zsxm2BfT4uNEzwgwIc;3nTUJS?X%_9 zzx#_nt6o2MeWqXi*T4Lq)nEPfPcR1Zi=qtozzjgL5M90fQw{{{RUb(IX63^Yx50g1Y4Ik)g%+n@ z_BFeeTvYFYpNuUugSHFb`aFFBha>n%ASF%`Fy??qg1W(_E^~N-6VokYtRDkn5AQ&i zXp6z@Jxr=I_QSl#Vq^-w^9xb{ez|2S8B-uIouSD}Sgl(tfJ+=QG1ILXUn( zn}NT$bcX}X`U=KJ8a`!3^OCw}sN-b&b>Pt$;>OG-*)U0mG+pLrh96@g9pff#yhE#0 zk#Np~tjt3UcQ72+0X2Q*9^+XvLg~Rj2B*;EK<4WouSqY&9R=Sg9Nad|qQs<>gHHmC zWQCx&LVJ&p&pgQ{%e=p$9i1)eXAOPj5*dur*in;@v|y5MZr%XKT7z^e(%Htb;z7!1 z%uq;TDXYhh=L$`Q=0V4rnB+>^r9p*R*#jA(w35R7>4l81&*r1hkjv$Fe(*>5*UyMA zI%ht`sZtJQraZn?yd4rPd_8$pK;Xrh^%C z#-;~Obg5%BYi)>gjfKcvo@wC;fA25ZF4Ym`)3v~ zNhu9PvQG}4ZE{fUt96@N>Q1c$^Q#CeG17!!rVdS0$Z<%W_LpWcv9zhj6F23!FwTTy zpkyQx%}9BXj*59wX~mRJwPu__0LBtWO;k=6DFZ{zz)^+7f?ACebkg};AI&5E5wV0C z?X(}lQFy7n>+NRU;;#h8H7I}Ut}TN%s6HNY5+2RO5Y-iR2m=q-@EQ>J1s%OZVpems z?tS9kbYNNF6thNi7RmI$bq5HYLS{I8Ofb_;^+IIaR!j`#pWqUcUsJUU``dW1XfSZ7Mo6H#X!En)j>R@c#2Qdyh^jM)quCKOYoYfG9JOFOrzB#S_?Z5eF)xqwP z9GZ9J+uTPeajj>7gU5S_6~qaz$QhDS5ByYXFa_8Y4N`}ww&4-FV3?0q$rSvMfy;o@ z4jn6ltD^yRwMr z9E)1OYLAp}JG^txF6kzv-oZ@i+%w6!-&+VrY7?4FPmXr0w=bVVkO_vzY<+zNA;+0S zd@-!x8Ch|TSWElekH4*c|KmHnTu;z2o7MAI+tdRr*r)LF;vVJ&7%B7gSiD|TFJ2y@ z4YZ;~D$wl_>$#69c4wd9{`WsJPBH}6&SAcNgpzaCK8^R95PBk^?;;o+u#?Ayjx~&F zw7z;UpL`2P@ls)~#y7uxUO}k=9&{k!;=AEHUCgjU2zL*yMdqwlH@d@=Izpo-juibE zN2+t)ZB++D<3R7wb}=P`r+wgd1YTOUF_~H^j7@z1hhM;(9cToaAtrHy=ywoWdN5(r zs_8H%&T7)si&i{P5OUcd3=ACB46g_4gfJAHehQK1I;LfXDTOx%8W`i@OCOwvmg{&% z=oJUSZ|hNLetP6uh)lUE%<4l}Wew4JBco;FTc(GCqr@F*AQ^#{avgf0W?go$FPf-Z zo5?&Ke`#T%JJ2&2`f^DCKKB*o%}it6ZgOCG(l5X4Yq8YP7B6$r=WIt9J$=iVO6wnS z0l{`d^xZtcLwdT@8kc9vw{^4#{0~P6QL_$evETNWx&?>tJcUcjvdue@& zf^buG`4p!x8K4Tvrf;;_=Lt_^VbnqbbP1e<4y4_5vcAWwVSs7|;aWmSg6M$CU}(H# z#I+)uB|#J+WH`}aKnUBL#H^*=X{@I*K^~n zE&b*>#20CQ7r?a8Am=)dFpze##OF{m6138^<_p_EBV$WuqyY{{AR<8MSoNR_Na$!G zCg+}`70WOs+$NgV#3eMNp`aO=u1qOOL|yx5QC)H7Kkg87}m>mu2PSQuGOl5 zOePj{9vGMY)*FJVmC-;D4Q%=MF}NXcppA^Jo5oIYW-=T^vu_hGSVkLS?8L#e$a&45&_qj z?%Azk7sgPh9W#57PA#vVAHj&oeuGwbdo{u|zYasG-u5uX8UBDq$hy`D?^(5R-P&m_ zI%`m;{Kyr%*@D|#>8}WYpa+XXt`#7Clv(1%9A)1BJ)r8CMLJIRp z{)EUuBV31c-#wElD0p;mNJ_k~>wpLi*`kU7f)-K$eAFhV8m7KiS6-tpew*95FEgt;5RTbQpljL^BO#mF^4S&fzug(QRg z^}bvX!**y@QycWf_($-Pnx!`P0fLfFXb}#9Pc}$EHRct@17VQ% zT8D9r)(O!lA1a9D$y%%*9Oi`fm40}+9EC6BU7oRzas$6TQ*#EOe4tU_nb)OB@{2fO z$%Ht(u2s^vT&4?rtTyd}7Wge}a-UP~iB~!Y(R!{@tL3X9axRY8rX+x|TegRf_RDml zl;@<^R!nIgwABi&td0+)OfD77tCh!^mNrNXI)&8WZz&=#vvmrXeyf zVWuLzW)j!^%#>meMc5ex-Y|hBCfzoSz}%)XY^A3G74awsb!^OdD~OL{L{T7_(h!J7 z%S!;Q@UvXi^3AlT{v5PPDbpZy5Bps{v_;0s;K}F~^hYzJ#K-|MiLe>_Gl?iS5|2V3 z^*W|X?M`?#5EEb5CR7Jpv?_H0doaYjeRE7|GHLJIf0I^=IF6f%u-CxC%~dCkC2&(J z9x&Ne)D3yqfeSW)q3ht9F!lPpB8!S~W`<9=CM1j$6zBzJTD8)GloGUi7zOfo`nE&^ zFl0u;d4Us&;RJgJILP1xq#L_TvMF;%f*;FVVUQ!v9e^(F-p7;hU;p_J^y#Ad^zlQr z{q47yEitpw?`LmcRe$zpKOjJTsXqMnyt*ZRZGu*|#M@KpcZye@Oi#jUnzR{ShcVSL zeiLA1GIY~}O)#&z%ScV!;5e+I>M2Mc0Iq@CK0igP?6M|#d(Ao&8ryV)8Im!=R=^;s zDdM=p3lq$s4c+{}GaZNEz-ZqPOEii$9!zmiiFYi88N0?-dk<{7f^793n79N!Jlc|Nc%DO!omD=d_4ck?r zwZ4Ek-~IS=#x?|oG4o%+L1_p`1KtAwh7f!N&tGbQUsu&w%(xRtE_m0e>*Bo*X`dL8@8n1XmdIV7NyPf5(?}X)rpM zJ7h@al+9LMXuLLUKwj8;(v)Ql5J5}RzRL`*muKT^=KGM;bTT;c!M4j>#d+tW*J2f7 zPI!1vTB$(mTz3wK`MH+PHRqu4(V6Y>c}~9424Ka!&hPr0axBAZ&U=qq@Nka11X2z< z6vD3{stg33;rS&JrMQiF0KBn0C7t2{s`n?NJ@~5%*txi9Lnu9;5|_f8L1fNX0`n_lljo?EGUH`xnbc=_3~Ro9)5EQlnlo(j zNH2r#Lv_F|6VJ)6f66vHdzcejxTbe^w9nHu7)Be%jco?ictZ3B5SV?)(jAEo<%C9gZLweULUE@!(p_1 zxF)~oCz6%s1#I>@aiiOeB3Koy^a%RHIRYtS2)+!U!MG!c23ul;J^? zyAoH*Z7?1{y*kCILT&LO+G8;xn)zjf_oj|X2ROJWc&dGN$RlZ@1Yu$O9e*3E!%9hf z3|r*4gkg-?QuC6Dud@j+a53AB>nt)%&Bg#G!lWLYTito}=l}dqtAF_~eyINHFRu`u zPOIa?Z)oAWY6oEN61xTxvBpMq;D$IcX z!<5{;zC#Glz2Okx@D^rSwYv2-WPY4yvPOYKeBd6uw5nid{4Ey+D(p1pd!-1!ZNz%Brhg+Ppzy;TO zPuRrQ6oMT>i?;FjegE?pk_0?dhnP``hk=ou#H)3|?#8Z-U%>n|>Gkmnb#5kj8%87X zkeMHno#uwQ;I13zKV4Qoz59h`_o`0T{OczcQBcdiH2>(blftDxr8s~co>$Z&Oiua{yFYy$TCRR6lHMs*K(vKJk8iD#Ha=8P-n78K8+pcO`FJ%UdHHGEJkf6F2i*v#0;CegKQAI-!i@&Oi)8pDz-OrvTDxkqFIZok|d0V?IOR8NsAZPToK?e}oG%&V(y`IsXXbc|$<=UiJIm{a?aCSR+J8 za~r5JF?|Ep(w-B9zx9rsjzlv^T(0iW7>37;#czqBM5Ba=|ACyRdL_5r7K<_5?H>TB zE3_{N?mebxa13M#Qyao~I%sh#gtGTAQW>Nv)Ry303vDhtia>?0?hY_zwh&qrDi+{|c|;Wo`)$_$%(aRJtEc!4CTBC}fb7)+b7W50Wtb$$q&C{Y5y|yPg_-QS!D!qAPXp6+FdDFqt*Jg{IB4Av$C(~$m^#Lp?v2?6T{MX~ za{*f6^1u{9ds{O;HsIantXeh+(la6)(em`FXd(Xq*=#`b;ytagHwEK zYvr3k_Zj(Ylze_9!L8H{AeBWZVw7l$PE&FHb zPx;+1eljJI)FLSm04Go9RMnM}zi*$u15nZhYO1>GhI97WXXj7`c{Ml@V2@;~2@)az zL5pZFzK=8r>~^*~X1!RHwcGO-DNUb&`t^-ZxKu$&p|9du{%=k#aV5 zHBn!dxKOI&!OCO47x`WjNPfQ81CF>ym}A*Q`l+tbq~)1qK3EtXBVH`)D4KLTgmxb=1ZTClV8mVMBy32OUc#JXdzd-shJ<-FeLt8{msv_ zJvu9V`_1oJKa#2m`WO|7ZiLy+%4l+MsW~l98X~eSU+Fa68-E zJHT&8zy{g?U}A3YSj^5d2>GK2_qeWrHj{#5)UYF6$6QX6;$isLFi=}iZ4=>Xu-WD1 zc@)Yv5GD#)um{{P)}?stCHaX>go*|MC|2)z z`SJum=XJKVPH-CQqro?pl`q zLum6FBaOkxU_>p<$^#-vjo22x77tKxbw zdld=uZ~e`=+y2Wrd5!xk=osI{zUOb(5<(Z_bJuy^dqsoay+>$K>_-`(2e*rRrq9Ab zMCMCiCQT5Z<1-)fJ?+@_SNlBamDY*;2n!ecxd3yj;Bzxr$l9-3XVmam#h9b^t@tdX z2};7=1-Cgfo)hFBm?b5NbAp_r05~kJkauXi;vXghy>SisTUU|r19^jH$RnIj(k{J; z6ZV?K@Oc1#_%+u^W8wnm8a79NNwkLz9ysYa>?`5Bio8h%z&)dofGuR+hof>zm@#>D z0Go-zrGkJtCV`6z$JiZ|D9XW&ByjrKe3noa$Hs{9rf1Q{~0y z*hVSx4Iwzu;1i;<&@6>dz$nBbd1*o+X-E6+n(xlJ%Ch%Pb5RtD6INk+D>ZTOU zbH9fHLlP0CV&U$*^&@L)y+%W5k`jTUL^YKpfM{lLLm4Sn1_#W!a%1SDT&W!ZgCbgS zw0J_p4Q6lf5;&x}r0Qlv$Z}3rdkOquP1d>2j_B-Kegl!XXBEQq`DahEzyA7T7|2_4 z$*6vF?-^BzFt4Hwgw)8r%FEmA_WUIK(;vPg*aX3eT+|CXQ)tzgvEiJvINZmdwpv^S zQ};WGofS$3hTBu$v`IfaW!VyG14tswjZPDU?`uXC?~ac!;Yq{PCT=d!7`qTLtQRnN z%YuoELDV6X65#c9e2g$LgLt;-MiB&&z?vD1pbjG#Pzb?Ay0 zU(U0a7w^!_NVZosYdPiU)!@KP0qF4p^}U5_V=~G3`DKZ=Gn_zKaPv`wdn64$h_O&!O(bigS0g1i8C+5Rkp&JdxtU$QNbDFqCTptA= z*Ua&%AsLilt0R4j13Hm-olH{PP@^)pQ^8w}EtSk;Chjfps?>l^Fh|dq369AnH6}o& zIzo_$6f*$gnz;6UAHp$vKVSlE+$(@D=C9Bo!;jz(X^I+=dpww4!mZE**>|z++0Qu* z5WbwrM*V@=C0MwhEh1te1M*?9h8X=XZ4h7B$c#xkq;|+SdH$3=zC^21lM6E}G~c4v z=5zbJsFlq6sIB`*s2MlnH~tm{*t&e?cg88K{^G@c10oU{Xa+kyo~0QV-sGfWVorly z0IhW|NEZI$aQ-|`{^WU3vor>utM!g=q%Yi*%cKMT>$)ZF(rZY%=L-Olet>hck@A81 zFd3YSrY${)Mcm4p_;S(w%^(A%P$mj+)v$t~`f#8QN{4xCrACEG0p3UbNQgVv)$xyQ zG%*Qn&a+KSFWXGD$#)ITUBWDvMDhV42ouYS^L~tj*XN4FR-0+#W7FgkrVe1|Zw5w4 z+%1I^0W%<_9V*-$7#73SG6{kxbJN_w09vN|GY;_dXpq zu$?qU5WhSOoKw?cvk@d9`DXa>z@3kW&$Fn2+Oe8{hlFi=raJd>R8|Sml%%PNVz(66R@-1s5-Efa(<34R(6ccgd9LGetTJ7R z6PB6iz+NfSSd~qnzi?xnzIKd5v-bd^sV{aLzv6%W`_Bn(DP-UM;gtH6``P`+2if)c z>#U1*G*Pn!N3tozo#@C@s=|nK@4i3Ej;R{6f^aYJH%Ucu4hDRhBW}cZXFZ-guFG0 zkMo=0Q#65oYs=b?7JeW~8q2}OMURw*bD}$8e5jGbTlOHPRqwsKw}D1;5kWKJM4Pmt zMEDZZ9uTBsJ<@}NJ<=&&@SHZph(MY*M|Ze`c^SsAy@Oi;*tc;xFfCvXqk$$U+*pQB zO@E9j_nHRARn3ktYS+geh!^KKFk@Os(b#xEK#B~S^5d9h2U!oMbq{m()2D~o+cy+R zx4I3c+&X(=z-I&8%u|cK1fFPFu)M9@iq7J zURJP)VKaW=Eed8qQB};0`duJ9zxXoO$}) z{2}1!{@gow8hl2^=u3g#c3{FNoeo_NxB_>^K#(Mahz|yts6AD9h^lSO1fXc{^gl3} z@3a}vMqgrm{tzA3RJrw zQqdAfV@y^stuT+slr%LmL49BbeH1XaMorY z?=ZbbL_sorOWnzQe!SVZeXNgb{=kKoZ?ErgfRNm0Kh`f3VI-o%j)mp95pAn9riQTjug}`o?&pdIAFHS$#rPWqo zdXEr5x*IJtOp?73sw9%f@A}!!=ZD!nYK{)RrJ*kVXIl*2P!bNr4=qqUQ&Z_cm?bEd z`LeW_5zh(^`jh%pjWPYC+uaMMIiuJ_uSY&0`En9=dlxFP@9iE!T=g*_5VdzgC|t)( zyR%2&%k2f)-X#LUR+MZ@xpoHfpdsU@iz+(=x(r~*7NxL9pbTKKGFp_>4TOj$#Rm)^ z+uOYdZlcMs*K8nsLn=v!(r0QtVf_I`wh>YmxB>qB8s?8V_v0rUQ4oDh)M;m3W>qH$ zORY8Gwe&(w*y!LD_^Qi7?26jOAd6NOqczJG9uViD&bf=g+}1V5sP7W%FvQR_4`T)J z{gN8t{?hEO;5ddsdF1%-+RCuZFV(fMM&b7&e&WkB0&cWcFfiMT#XgMv0lqUY_lft_ zmu}(fy}g|nmyx^!1ShpY$Lad|Y%MwpvF2bdpeJ+iQmxDA-L$V0v9{BQU2t4iO|!y8 zK}i8M){5&>^{GUEbV1b6PNgFuKm)tjm5iGq22QDI!)}~)ytL-zw8VMjpYzDmG&jsb z9Cd^YVGz;N%tZ~9re^E~_b<%jE(+oSBDi;0Iq!W&4%U9PF) z)V$OEgH5 zuD}B~-;&K^D;Xm~u>^As7YaG%Dw6A)Q(8>9ZgIPqzfooRVd*sw5w*c)bz^i0zHzg- zV8T>>y61u(}13AVpWygoX zhI#TV{1YZ6>)emU1`xs6S$O}>5k_XIa9{|w(vXauf%05o1~G6PytAk8V2OMNJSAcU z2!m~~s*GD-qZ)+-10@IMfm95>SV={sZbBd$n7(fDADNK9fB-MtG+eLdX;^%njlQu- zULzXE?M;u3k8s2F*3TR=zaEmcnz2F<G2@Df*JNW|JI@mrVW8BZJ2l!Ys9h-KH#AX5RJCM$A9dPmOQ@?y2de;D@w% zT?4h{8hM0$7@j!UhOtzL!fa!f9H8MGpB{$=Llh2QmJ!S_7t;XN+pICUlH!)cQ+yLw z#Y0U**Ei=dJN643V? zoCd$30g|C8#|I8cCXz;n)=jZ(gX^Re<_WVkm`cjc(_Co3!Q1`>P4XsaOeBv(SLy`M zO~C2f+mirbK%c)5Xp{NWpc(y#$=4SI6k2fwbHBuwERAyQ6@bIH&DuniC_ zS($jw*rns{VbB0t1pP07SL_*m(Lu|QMqHaHbH@FpU7D0RJ-L5a`xLCgS}c==yMPI*G8mVVDBhLCuD*t&UUVupMZ z14}@s3KWEn!2(Ki1B*!a=HIEY6o~Gr@?8y|P7Q{+jbnVPMXE#u$Pf&|cO`7{Q^GJq z!kLkv%yml7MG(PIU>9=*bzYG$t*=1IRda_XP3_Afi^wIBH-*B(g^%x$GF@!PFQI}S zu;Bp`zc)bCvPszbB{9bapqT?07odzA`418;Uj_4VHN`vcX;6`poMt6Am#~?jk+?A& zlfeKvLb`$6`F=0Mc9TRxHCIs@9HwnwKM1G+2Fy$HsR_Z2$|Qqni9FZ%i6$`C=pY}X zWMKRr2*SNm%NQgt#+Sd+Gt*|!EEvq1`&(nwO%Z~QvH%bDTqQLLSeUhdlg!Iv1Trd< zaZOLL!@w1RBn38nl~z9bYZgT9&GAjK`V>k)!(yB>{0j0}v4b0`%Eq`1plVWvObPVn z>KvHSa*KR02cdt~WxRqBG=R6-)aG_K`@6sWI@^CrLF{k7MFU)AI}bOqdYins6N(*_ zkg&mp5k4NH2TxCKvv)@@L>S%?odj5NV6318Qvte~`^p4o3Eu(;Y{ioXxF8Xp0OP2| z>n20UP|ELgYuOeWZGUvldN(m^5-5T;X6JI#A{sLfx3^%xXr7vI^(otD(Kb^b zJbs8Ta-G5hM_J?G5P_^6Rac(u-OKh#1-K$Y^MVcx5`+Q~l-&(Aamj$Vi13Sm(7{)3 z0M8hLKc6~ZczgzFqDhiNU6Si8u zj7VM0YFbppD`O2b@f(I;f+$ChE8od9g|TMi279K!y~Rn*`8KjvV6#T3rTSjIJqfLF zj~q(P$wN{rde%i1=He*YjzXc@wM-|+Z;7WV6PDhSff(T&j2`+}zbU&Kc z?3i@zD2(d5k+I4YwTeiCZDSU6RtCs9TAk+54q<|r9`8Yxf)UCTpk2^_cm=hFc5s5S zz06H|E{yZ!etCg&NemhM=b2tB6Lw87PV)@TQFCDbhOZCULS0xlX*%?Xy%t0fxI$UD zN1`v*AeQF&Y`K1r4szX^`XHr2n8i`a=8g#^O>CG z_l%I)In#iaOwzeW@F&mq{*1x7rT0YBg2prEBIei_AsxFgp`a7)tw86rVHp#wQajjRRm zYuJ$WovkpRji~K7#P`-gG+Ho%d25IqKB2~?jgQ0ev0K}CpQlsqfW2hrv@fhCN-{7u+7W`7Un=LVFyz!+?yBRmR(jJvt@ z?JSfu<)~iCb5aExp2@t_P8^?O@t(rQzXL(}+@P?4=0{~fO+`xH;Xh=ao@YVpKyvQw zHSr9_rBoVY17Y=rcrG)7m_vLpSzq6ogvM;{IzALN+#ZDcnp6=hwloOaH)LN)u*#;d zqCGTWq85{OH|VpoJ$E)TGq=&`DmHvQ%6uisTR#F*1f~<}bau1j zHxwO!A)5QB`RxX?*8K;xQ##nCAT`?+|A|2wlj#k9wH~nP!ob>;DLa8kw1KTI<64-* z#ElR#dB6zGZy&R!>ue!#cb%P6EOKymcEZ@eJ=R`=WYro2D%6}eNOs@ZLvx&*!F=%J z7+@kXMGG-O-DuXUOY$7qBW;@9TBdFdy!q(a2Sj$w_p^=ph8`z|7Fr5FonvAbX?=ym^b+ zvABlc-!2epKrj~Oy+k+=|D3P*qPQz;gmy`R0gB>EIIZ1`@GJ;SP z|6uP+dVPMspM01K51M+_{x#>?kJ4JJQ_gXpIp)xu*u%y>BpB+N5Q@;uyS?eV({!)L z>yDP+P5kbSbK*Q`4mjmn%tN3`f(R5YU?mOJ3KI8*#wMl%JpfTnLnuS*=EQUG6EFCJ zwocYa?pm^Z002M$Nkl7oy?2tOwZCu%b?VMBb25Up7$RS=27r!WWuR}72^GbobE z7zW3QJOHOO5_y}};1B3H|ExRBo_2_)tB~gd5rMV>Tv3zz@@x{B!c>Jyku}-;WqXoA zoYWu;qJX6E9L!9ftK@_+QzgCw#t7SoN4O>s(hdaU6DRx7vgYt$luo&EAqu zHO!6;d=b&h4{2BPP7P^qG`s>S)v(y`FiDZz{2-A*`*t6ngJH&MdExwJMKpoxEA`Nz z2R$HN&jeztV}PW=v?aFW>n({sgh?_o7QhXvz<{KT*-8^g`14pC%|h1Qv@?K_w`w~# zn2LwM$)>rQ18NWoOD08hCi9h`OktXKly{>!XL+00=!Q`u?xCgIC{?X`g*3h}$OYy) zU?SPj;5Yr8{ANe{+#9KIh|8TbdjLm+R>*FxJFW7)9gsM0hfhIuKG1AjKQm5)p+ zzd)lz>tF*OgeH{ZO;u33u_K_?fH zlt01D3f?GmF-}_*9qb`2GNcPqGWPL93^7N84xvGoZQTSRdiv-P6Y>#r6gNqwz|0%) zhEVo+@XMEP!U{kL6h#BFY-fLuy@1fHR{%G_8QN8ko8Es&Fc;(BY#wku!8+_I>!#MR z9^9~Rj|j+FLyInvrzV3NP$c~aq6j{MTWUcqV6s8V!#%3mnA12{s040nm}rfhmZ4Zw z+=#~F8iJ>SIQw20Sxsn$MM$5ZR+>Iqq9ySbnC*?`9cXGtQ=IZ$vT#g+5xoreH`zB@ zt%y)X*h=l9(1IC{#V_8xr7tAoSVKrNabE_ja!}y>xwHzYe}*7u3dI5((zM>djnNyV zc2=6+4JMMATS(mixe`L{5auUoGQUvkf;46gCc4=HfgKODM_O!7@*3sxD$L19Qu9pL z(6}w6uQH&v$WWmL#zKHAXk==!zSzn^+{0(bzL$OK_tP&vo@ynL251F=u7Q`DPVIea zY=?Q^k#`PmtBDzD&)19-&A+yn_4Us~yQ38!b*&4G%NP;tbnF$ZGq|>NSBUH8bg#f^ z5FN`NL5|>>1@~9+y$nFh6!T?lPC|8KhURC9M;WY4UlVFPy)z!v5fCsFWJ;9UlMVFNn*sTmkj*EmN zgOgKomG6*gHg4M3CJyU(bTRx-)mT8QVu#O-?<<6Nm)M*Q67bg>lWd!Gi9MQ}u4@hj zY4n$w22r($tzocAB4|78Xb3Ni5XsDY>eDl@LFstGf&p@d$vptFQl2k2mQs#dkn@lr z81NB3G=59JC&?+zhlPhAYm%_)h0H?jPbt;hI3>5}e}^4iW>Es+m{?*c08QjXUGj5}q*)>!^SYoEp!z3~{fWr!6J_OcoIFs^M zz#@v-G6xUGZe3Cj34&6r61gxwrU3F3Y1Rl*ZUJ%=d4~_$3NZ3(H4SmaK6>U38g$b{ zvjnOkUG`xDYDMPL8Vs{U*kKk*$oVfqRss6?oqe3#IcL^OBs z9U?T0VHV)3X43(AqngP!=@7Ag7|j-Kt@e-z^rN3=8;oU%@37fsdY zXjqd{gEDTKJ<(ENRt?Om2H=!Q2|1gc@SSas$VX()Zg-!CP_ck`-%@kcQhFPk`vfcX zh{`3!0FKwhPj=KH{HxZnOAT`p{vTuG@7Y=BlY0tQ?)GSj4CX?V>l)Q7C zo?9W!#Xg3&2yScoKXpSuV|0V`u}D~qU6|X5*u7N&FAokrjHu4Cdz^j8Ke7LZ#3{@X z4DD^H?=Aw2pmq999kb7Ky(1?UVM?>K{$9V+gv*Se7m4Y>F5})gjY|8Q9S+^|I`3!h zaDnbE(xMI0VY+Clef;JSnHY~a5&M~S3i`xzJcNteJ2Y>IR|O%@N>U!q)gZI~?8s?C z1f@yzSQF28Uea6Vp+;&S(Ma}ZtO_CSnI-#Rw(4=o6?_f)#0stupaa)=7=~T0=dWOF z$x0T*033+iD~^2p(yhBIB}lLx#}<+8Y?Y{^3J;QQu$AI)Ke5sIeD@6g1`L76Dm?z~ z96W?ioF9Mv$A3cU_>9=T~5hQxVs1lML^muPzn9_pag zBD9wmVQ$gV!x2LSbf$Xy8rn|_iq^#+v)3AC2ee!2l0>gWV~1y}7+5B$iT{cJ(M+sB zg2@f8t~MkCn2>-hGWhZ^P{fzWtVt~v4Ww~A60Ag=)vy2th#V1;0+_#mymI0{+58UzR?M zDVjFBIKBggVvOb~g1x{21_^;Sm1M=5TREg}aRnHN#lCwKMpyz<@wkBG+T{CnB*+GX zUPBAhha--;?!w%F8a2@(zMBT~sSr5x=-zhrAw+)zhSk4>`Cd)3hhKaaWyMyQ)fX^m zQ!Z`^$(KM+u4mcB*)V%S{@)c*p*%PkX4L;ASR|6PSqmfm?(OVl)dMsgD!%BKdwp~S zGv0<^AqB6SI1cfG0I$%3HN9$zG{8d>=S=nAgMA?mhFbv~3yD2gC3}S(ArlauaVTlS z#Jsaxr2Z3&Fd591K}b!^#u%4JW}(tF>n_%?*|`zn4P?N0iL8*SmNt&*v^`0 zKus(w=V#OgRfE8#Ab~NWS|+`{0n>zOy}LXHS23m19pvVEl70Aa7gH&|I84bCaAj}% zF@5qZDnOMQ1X}~T)LK>sAF&T4x}a{rMEsVhyPwm`NG$#C)J|oOwlJlyaStsTN5?me zla3+ajp-|9y`XIIH#53HR(hl~Rg#bLiNmVWHr!X4u;}O1tdhxE3;NkV}59p-h z3Z^1uzB?z4%Qb*5F&^ImW-w*fsg1ALK$9@XLem|qn)V8Fe2G`3MllGQCm2~O(>LD{ z9W&^2s%k?JSpq=}CFdnMQ!(=2eWhk^n~aZhjXqr+V(9rJSip}M==yBc5-zU8Vs#b0@)L}=-zlT84P zgmZp&Yzd|bm;yg(gd&IB90V=iU?QW2WrKQ$CAxz{pbD6E1enOUj+W5EoKi${R5OeP zWJ5>m5E&NQnTsT1t09Q+f#4v83~T}6%NNvZJy!|JdHB6;RJ_K&{oVV>bd;V9pr~UW zu#mTA8wsEZwc4;FI+gK-h6+@@KJWe@9KxXsQp+4oI`-vZWqmhvz>90@1i3p6@%(qZ~Mku~dJf~;aznjxhZFgw;U|JV>$xQX~y zGnpZ5p)?Sb182uPYOquRO|i@Uzxe87QVB5e)D{%ueuMAuAlrVhPiZmm09=`2J{%D# z2?)`a=+k$mnHX(u261AeX)e>OtS?J1ryERjiUiH-DG&DcNmaR_oEeNAm|xKep~KpQ z_6I)IBw`R`ndrp@CSBldMUn}DCL#H&xc~%%sEQPca9vzyaaD$AsVWb@)3?+>;1FNj zM-hxfu*-tzYBh$f-7NxCuCsS<@eNX&)B3JF3IP&x8)K1Rg9%~6Jh(@C3JKn?p8uJ- zQN*5P{{iOR(_>7-Ff`ZA^qaR7+`b{Q*1h4JjHHw?YT9={^w6FS#QEf-5BZMDG|aJ! zb`0GMhN5dK-!imY1c@GjNhdJfXXJRoJ0aBg{0aDx654jE!9Lp|Y5$xG zHbyXuPvW6bt6C~#Cc@8;Lo~aQd4r5`++#0u4+Fu>?KH4V|DQfXO^$#Y=0-lIsXE}} z0O2Cv=jKcbf8lGcV}k%KOCdHeXW=NM7!^E$W+vjOv3)J=6ObGH7$ej zv^yHa7<@Ws#kVpnM&V$@0N%j?zBG!|!}Sg68G$M>@^l}+bH34W$8+V30-yaXUU_v0 z2f#O{{oc>d2`>KSB|H;G%$3j|{^g}+tFndZ7)+K3NnsgOnCJp%Fhgz}2Lv(>ZY<{w zP0dO0rOZJyh|M8oGV9GgVb>A|qtx&}!Qe_XT&=bMcAE_e5tQi8LGnNxO6szaoPdC&RV#>cKL|;Yis9Tnry}}CLQzz#vLYJHcKwyN}Nqxn zWYq>B3TP`U%ve>3yuQ;h8;Teuu7${Vn?ZzSqIPGncb`U==-5C%ze}PSmzcRe_~gUv z**w6xqyun8yersl={kExwo|<(#85mxvF{ z6~dyfCQQyf5PmGq)!eHH;zkv}WR?n3x(AwQHU?JB8G{>BqCdi?X0Xl~=095?UEOH1 z!_SIPpv9%ay-UD-#e8i>{N%}#NX0lgJI~&oT*AQdu{Nm6LgrA33P={T?qS+ZKJQf2 zpo4JXci(*T4Z%k#EQ43vh}L@|vy~Cj?M9 zR(x9E<~z#Hot^LDf7=Ry;{r|b^!yw=rfn4d%L;|V_h5)UQa5JcR-0-*3)WiP&xyRa zDGs8%B5YV8M=4!`jYi7&dI$$h!uG6ti? z#dmXFWh_zil)?!X+cs!sNc60DzlO%EX%rBF!$z@kLx`kWa}ZCS>hpuvKu7%EwKs;s zfE$^}5`VY9n?EYk^?YB>!yvVaLNY{5EyUz|PzGE|%u!)fx+AX4nZNYNd$|u4(zV_x zF#B#$q4*dt_MLlI`km967^Ar2{`5VVqfC-1#rOHxpoY>K=Ba;n%K8{hYffehVZ%A8 z_4-WrJfaxDxuOm*QWDyGM4bW){o$#22Q)w$iy)bvn>4#9&JUF3WU(&5#DnGINQ{dK zK>v88>SEzDQ_?*}A}P8uI}?jC9nek~B`P57@krhxfF@MQm!?e#ejqEqMfVAQ@q0;{ zgfW;UlBd$A2&o2_OK^UdBc($WAtg3$0;9`>Mb(1h3Lo52ZP=DL5z>s5zG5B9m~`e4 z>=hew;CC)K_j23`PRU0ZlAN0rxEoxf4{r=&SnfzkH{Xbn6T~_h37p^tLFegF^@jVK z59d5I0mUZd?-~wjgOf%`vNBjDME%8@QN~aV{dsFJIZY|zjKab#eiK_eDR4AcFFRgO zn8TFs)uuu_hp1WLTSjpM;nJPv`HqJz&!#h%l(J=Lm>uT!`B$H3+aDfelRsT#FTOv{ z4xT*D%Jd9ePH*XKLRSa0%cEECf`RsLmIy`o+E^>sppDN@4fEpSEIWWnJ$(2ud;9K;@fclu zmbG`bvn7EYntjEITTG8_%CC(OC=Bv2mu^54ZI3o<+-TsFBUnd4K4XL@Bd;wXr$4m>?QzfK zbvHG!+OXT!VC(ovZ^6GSx^2`D3~Zn+>}+9WQvCqU(Q!&oT+3iMj)plIcw(zF*ULR9 z^SQq6h3_&NegnfQnz6aix=-}CR~c8HOipA+qKsL*o8sg+FA zJdPmF^h} z^OkW$9;GngI$vHBj4w8G3^9#~@0FNpMprV=5n9s{VZvv@wxbX=I2)ULNS<8O&(y5P zy_M2*)K|Hu=FnA<>iob~DOWJ~OyQ)NvI-$dl|Oj)9h}&^2pI_$o~!mHAyF&SIW8g? zfMU*}8nI?U{Zm$liL!0vhdO@+AN@n^)z%d8~%o1sSjo-R-9-pHP zTE%5RBC|>Q1?ti^_t;E~ZETbpuvFtQmu!W3I9f|Vu$ti9*Ps6^`xM_`5e*~C?a^;= z4U=LWDSm$W=d6nMxZqq(Wg{5co1^ROJ3{3{k8ifrDcPK-i+oa(?p}UEz^@ zXG)!H@+H!s#G+4nKpTp?&io0xV7|gDnJ6nTuMN^w?2V`YPRYbNvgRpW6IChf9p7k4 zNj`Tv0GEI&QA=#qdIyM$34KHi}QF3H^d{r24}f`gjb#~**hvoZa`lw`PL zG#Rz9#k?I_)_}+*&3z-*+U_bc1uM4T(ZH05P(tLUZUnCp*BCUWMKl~DK8=_a=QS&z zol-4lh^DS!IYg7yw9mRqsHX@O_YZgQAKzxL-&%D=zj)d!5_QjEBH&jd?isXVy`|=c z(8wc4L_b@*HfrC>423a-O9DP5{Y9K^F;_$V5BGN&8$o7V*FaFKfsZmW1;qjQ6Mk0; z97va}Xyl=gY9hXQf(BLG5{>GZ)c)N6;=J?sPzbQ%m4dYvD$UN`{|4>!it9=+GL;M4 zQAK$+)?DAEI3hj-9pT=|3WikyAzfM%ObEd-_8D_ceziov6}|ywqDj!+ACm6VeS_vO zHm~&+Rv#|#v)83~2j~*4%R?*AdtpsXr%TE6Bz)y9sY z{^%cXDnaL!^CjpB+ba1R`7#1Ofj5{G^T>IFHxd5%F(=wy95k5GuT$WTuwy;+Ghwx0 zP;zG(0*eD;LG`#Pfa1T1T;xK1c#hq>02%ngevY6{1_my6&tFN50`>!B*;UM&LiyB5SL&?fjG$|5St6>*QyaBKz=yU^txjT zjMGU*bp%JxBAXuKA*lH2&inzKOju$5aZgTKS_zE*jzH5+K+owPL%pYxa^^!Koo9;>%#QV`iW(!31inux-;33xq zHVo$U^gR3hzmgkCv49d|tcCTiOvU`Rkprli~n09A7A8fcn5o+m?Svi?Ss zDiGMQ-D3^|7XJS3dNAF1x2lOddP?2WTL^N4b>GDNr~g9XgPjwC&j!IGT_R@3r2R8=kUQ!wZh;3S3Q3np`Pip-qbXSCY@X5eBhod% zA!X7b=HCG(^d5W8%0K#=#=t!o2ST7O2>Uo9pD;(P8*D7;K!bT(Axe$X{qCM~ErWKk zVby$%MmD&}9B65!)|NJKRX7Uz#oo}>Vi1{Taji%~&2*>&=hWFVGEOx@$K&BX5N}+w z{Ig8hF?lGk_V!tL&id01+o~-+5`z7tGH&c>(S=<^y5$y`~ z8M}k*aATSsHmE8C(JvH@b^}3RgiUPYb?&3-qv52mOHYZ^s$mLTC^98&o$4B=!bB2tbCdg*IcPy z6O>2>;xyP8o}&t`fZ%j5U?MVp%f!i)oP*`VT+kYlqBcbtQ;oTbrv)~o`7$f=U^MyO z5cyW5;>nyjh2$p2^IY$3UXNx*39@~}$`WRAh4nXDR6IL_C@i@riI%_%CXKmp1=71w zHB%F=iDt($VGPmy6Gqo#yq9P#1(LikC0>lThgN3r3wsgx(Ce_Xops;_b;ffJQMtkt zeM)M;ExV*iK2Vh)ssa+^A^Dp(1a|a+rBY}Gv)+_3>|(0h1y;rSAp6xXKFdD-+mEpk zx`ANc6pJq4f2t8AQfc8M8XeQBheFZkv+U?}l6`-AnSJ{b?c~OQ2s9?OPLUfE)QGY5 zZ{75mzcJDF=?b9$s7@{(O)Oo$Q@P$1Do<_%TqAG2UstH~qp`Xzs2qd3xHQj>mn$6n;tBC8m2Nc@c z6!LzsO;8Q@eSJiUmRd-3`dp~Ol$bcMm}{L5c{6-oHdVS?hx3jcjF|5Lez`48FOs4_(I zqHThU=afJj63#rJ_u&#yk_H833A!Q3Q$->(}(FZfZ^$Pu z;+L*+U#rEms*CI%!7$=a@4T12ygG(fa6a%?JJ#3sj>pqD z+iGb9(`@s15gajS$NbqjYjt*d7EDml-?gr+GY)AC^yQXlVE5n(ZNit8gECCaR!mX| zx0x~&l<}m1AhkN%yUBDyP+|<`XW9uzOO2RRWRFa=9I%(7+LoI(h&J1tXX#s(R%>CC z(FS8>X!_=~%xJ+=AWkkUnJn-_P|&o1>`oplV@9yn-|7CAW`U(>-_TqhRkIkpdjcWn zn*FPVPEFYS!zI>_(jEP-u%rW#>Hsm#!E3R|_vq&32txwkZ2rEExvIGI;4y*LLUkKY%J(@5YV?br%1 z`~rfGb)5N$*)cJr;-L$Z8I^>>`jcE4D=UxLqRjx$kU|&;G}EgvKS3k~40n-;D}|X@ z?|TtKy+IV{2A#e)k)%8L2iJ&b+W@(?K&myLjCP^4rQ{*4uxyX5R|-h*<~tQ3B1XA| z_63kMBM2PL5^7l?@i1xa$h>g~q4>a{3Csxw^n(QA86G}QiKhzV@Lhr^P@P}Qk!Se5 z43m%X%yi}5zpO-F{!9tbF^TkE6JzBxzn?)UM8-MhUrkDy;heU?7QWOr^h=mGgP8({z5)u!r2wMSx(;z(aJ~U4 z12}9sEClFQT&rJ&)F|ekOvpaFM6i_RV$Iv$=M`qrA;h~%W77$PR}xzpNr#C`KZMOz zg{OLEh4~inpEU_#Zz8BP*cco49%dhY{?n{UI?1HMeIO1OR75$yI?dXP2LvjxrYiz+ z$P2u|&vcB5?(JJD-Ox-}pRVI6%;_L;Nr7x6*e4&{XJh{f37%jDOf!c3t4WJo3M7tQ z3%~+~Y?(851cD6V{GgohQIZ~E4z`t#t(BS`s^v&j4I;qIFMjBkRC0G-zUR2;yEr2g z^f%8n7({%`aXrkJ;WJFkazSe)rUibGb^%czQwFVtR{HTzHnOk2AaI7?zx}80v!6XF zWqd8!n)qfjG&qEV-T>hd)9A19e{R84uSu6EqFI|Z*N=Po+7JTS*+c!(=rSJg}jZpnNVt}LNvG{3=&xrsC`xcf&s zmB089_i)VbzvDc|k>eyw7{BHBi1YZvcm3E#?pF2BvL23ISi~HmPw77FcNv;{1>vW_ znkxuIeNU)dfhcar!C--z<8T0u0XmL=Vl(of?R-}0@aM2VBDDA(ii7JHnjr5$f-k{9 z_BDTL=i$$IvACW9J~3Wi{-wg^_erDVY`#yqh43(FRA{5%uZjLKChqUNB;siM4hT~1 z!vRK}{3KQ9h`8~lNMxWDgMe_O4nL+U{Z6Mq<$6q(MY~kvD}(`dK^SwxCJ-+xs{~R+0J(EKRj3^}yBR#hvuyge1#CN!*P_ zbs{3Ei|xcc{G3N*X_Gex4jOm&TQVaEc#%?oB;b0j{;*^YOvnQR!L;ODe2xHauM@!G z{h^c$m2s!v4DOj5okkfe$TElkfra@c!2lTniPPs9O{@QKTEpoNO!P%MG{5C+3>>&#vElX4&;T8V#CV}5_JL$+7@uaMJ0XL2 zllX6Vo+gp0gcl)f3cOZW2HFq|^GYSaE!O$Qwa1*a1p{nh@}BYgl8t8KzUMvp=})r5 zpFX22Zn7TOC4LA|zC{}wG2Z479HHp;&DE4h#sO0Q4Y_rFV2M;qbrc1fi(A%)F!0ke z2q@adr=L8?{@<_v$eOG{*wUt-vH4t6O{fvTqM!wVQzgz?sr6G+{b^d~;}M=G3)eOoyF) z@*__X*dT=L;TGTbz}z)Ne1p5a&2&$r!eVbawVfIvf9f?dmv zGF^h829*JJy4{1RFoPO6=ROekG@IU1wMY%wWcf(VqRgH+2}wgcLSS)EO1!l&L67)> zdnzyz!42HlszG07RDd#ZTn49*YJ{x}Nh^oM-^wwrm$XJAs##Q%sd;~{r2?ymYbb4T z{lp{vlXiiyt4>6K-mR&@fTotbXNJs8+T*jh3?^;x3IaBNTM33o2TmH$qMwxiC4D?w z=A4+Fi!i zBV^1!jGgK6aAygPV&2Y&g-ZAICw{QFyxMY!3O0q6P=QfxU=tTaKc>w#6A~!R`a29j zATSYqI62{2V8Uab>0o0=M|!^i`P~5Ga$vnI^3chf|=Oa~!wO6PUSJbj(wBo&Z>~}##`8&rizw?z7tOkV&YM2hkz-yIpBh0sU zpID;#>X%kHbPw4Y>=w0ni_&C8D#{F)i-p83WDpf(Adp?!R@JaNxQ26>RF_l=wOFsS zB;Jf9*DBhfCAjp#8X2k&HJBaqy@lE8E|Ce|!2I*|Q4o8E`6!4p>3l)&j?wWm$3G4*Bn(g-sc2#ZRQLyQqd&r?rTlTFl@lZ!Fh~N z0WX+oz>M>pH_y}(7F=G&3a`QnCTHe%9;``W4D*Z6PJsbfud@Rq+-gzDo-pecL|$SI z#U)7^Z4RH3jY{RV69|~03oB8JkOUJX+kWX#XX#(aML~=zoWHTQc7lK^08Xm1i+73tPy_J3qq^iydLI2 zjv0##O=JXp$-^SG!Huw%U^{2uyZNkSGKHY^@x_UlYQrWB!vbL{Y2z9Vr{i13Cmb}- zSS&r6SXeU_eS)-qX0;Fk9{Q|PgIvHCm@`43v3BT6X%8eJCWO6_U?szMeP-+s&0{h{ zfDlr#Ya}E0ISL8L+XzPZCeSi#XnzD4QyPo>xb}9|hJZ}*J(lq!uOqz|(9&$$JJ$3@ z;LXA3PqOWMlp6yFBP|8oxQ5``%d$fqRQufBVlL}lol#8s0-qYa>F`0-DH+!6Lg1)F zIvts0Z`BsG4#u^FIsW5B?p6-mn17N!_rz%-5f-WnX`}0bId#{5hWh(_50{Up=S3>$7rpA4b0YfWWNt zdG>Uw`?G`)1kydGXH?*mDDuaZfyc^bA*V3r1w82_j2j_TtqVJxvV+ao^b@ z%}PFF{p6T|cZmKKM%PD^>|}99X*%i(Gp;R~E9;|jFB?p?pmA~w?eL5=gDpDJ*k(xv zX*c=n3-So@$zAcfe{U$q&%HK7uYEf_>tk?rqVF~)d0z@z( z>*jA-8bTNcr(l=RU<6~BrM~A0QP&at0w`q2UMGQy*a-d3eka}HN_(&RT<;n8y}N&O z)VTXT(Wj*0a-%rkYaCa^Y5a)x`MoAi15vz=Z9!*y=$u*<53U7mhqjKn9=c`TW@wf; z(9JX`B6QAtv3`~bEV8HKfPsan5{B-5-ZMiZOF5F}Ck(-BXtZ=1NCCsd#N|ObGZfa+ z8yVWNOdcul5uU!sIzaE#*cH(DH+WGI9F3Z%GCeMLo+@WW{U73-FAl%wAI=5d5$yvp z*OsQbIK}?UeNa{{6irz!(k8a6!)%w-iB6qFU^Yp?fg#^lFtb=`9S|dZ;VU8+sys)s z#B5{|wsr1ML_*3g!WfoI%`)1aw7)AI8_J!ui+pjz_RHv%f*i3*m?l&c&BOeFcI3HW zEU&u-n*P2d)Hlc1{(dtZ+L#NB7%Ens!ddU&0`i$H##zZf;o zSG(mrfU8t%n7kXv;?DN_+u7XCwkdur!MsJ=uy(4Yh=rD*_5$2BjWaozA8*Vvs>uLEBP=Z(uBK=wYhfaMBnE!A z*ulijz}(E?(f?V4$x=u@w2qb0XgynJCFxG{Do=|}8@rTT>pa~dKmkH10>UsC1c}V3 z*9eBNmJ$#GV5lW}32{3)r$y5V+7Vjk+BShqoYNx>VKzp>cSA4*r?J9^F@zx=ujs6R zuiFw^L9CdU0Sa3PEe9lFSHU?useE^G5sbq^02L~r6!6iC+siBJbfP_(GiH0B*tmq` zizgCUH@t0^tZ*dWgkT0tB&rfY;UkXbcqNVn@d0;pIC|Zf3LlXh3VwgGThIRCi|y#^bIfaKt^{s$39S0-zj{DNhV|^XzyD))Lv7Lp zf+P=MJZRuBLGkJgZEcL%bZAs<;5!BEsm3#b5h&Q+lD0B{v6`~dB2YsAxBfkuq}G5Y z)`vDk&bp#+-+)VK$(rETJ6phr2vhu&ea!oP)}{rX(z+B4YJlIjmwol+2ieodGnylx z;ICFV);!EU1HYCqHlGP5LxT`XwS=&S!qCq2<}o`DixV8vlFD_g@Qm@zh@uPzH4)Sn zZU`&aFh9mIgqg{34XCq@X&oz)do|XKbD}B`)+r-Ha~k4(O?O$)uprmyr9pmgM6U33 z&7`u@CF33>BWjPH10juf_ms*8PzFDxd02NaA6FQIa|>pN6T2B#aWl9A!g4 zzQH=;s%^5o&d=hp*M%l0{a~ty%?MVwbeKQlG0et@UH;%N^FqZNc|p z>2Eis*X4)5<*)b}4l(reLZS&Iy_;$aq4z>;z3r(re}#3lh7=2l{}n8?0EDuV=Ge9}}X z@fsj-9G#&NK~x72;4L&vQvmb@Td79eP`Ih#ua$5$(W3lLSO@+|EP45zI1F0GyZGgI z`FsBR6k)1_P_sjt(l73>Wgp>|C?jCh(Bzv~$4^+(1wODRA9d-w2crhwZ;q)wO5n`y z&L(Y)*0SIK{zdkO-@ju&LUd#_GHafFIk-TO=rJFf0JC0p^DvTClb=j5(h6cOwQPVO zr{79KY%v6RW`Wd_8&ZFoXvlUDs2eP^d=vXkA=9#5ri5JeDf*2W)ZUB|w>`A#cdXgl zlk@Bn7#`A&Y8_|v%>}DZG%=)|=Rm_Cyq8qpdH4W$VeWDtYqqno@-{FZ*r5bVz{}Ui z6fdU;`SvyuwfLMNdUmF;ucoG1twI(R&|(qa^IH>!XN4>$60P8XiJGBn*I?hecGuUJ zXpuCXhGw}QCeuS5fL%&8aZO9$hRjWkF3}0J5g3OQaSbh4GoHDxbM~MxhqNUN8P~e~ z*0F|Z%Cn*oSQ2v-w++ZrSPe!a#;Txjk6@IH1(Lw^314!Y3FP4)$Kg8VG%{yi{_dD_ z1{;DH-^m067yZl_oooKG(Et);Fh{Q+;lc>I5!a>QFo4T571*dQR3nOEP#oJk)R&AQlhXXUlJBtAr!)+bQ?lZezoVz zNEiI(cLsch|1wVSJiZ4GsZT5Whv&vUy)a-69C!!f=@6i>4gx%EvqUr1=7J3=GrY|< ztN2YImZnJzkcKs3io8K&@h#4Ye2Yj=5POWDMwPor)Rv4$3EEAi8PGb1HdP%PW)Cnm zOe;-QwX1RDi>Aq`VuU4{ok_k*e2&jWNltwcON2=bG0lM6agNfR3+uv5%p!c4O{Lc3 z-=eYyr^NZbd%l{nZ&8(<`}kdsNI5d_b=*S$TE57Jq=u`PaW*G&*+yyz%KeuJ4R&)^ z;?j2~xOL_Svav(fU<%##Mi5mc<^lc-iHW@dtyaP5Fe6Hg;R89PPUV=5V4pzsaM!pF zY^JPU1!OS_QqyS)rxr!ip}>mV0*oOy_;7W4_rcMqr~-_~5Yman8dJ0phZaEIA)0gq z!MnDVlbU8AaG+D*cZp3KCW_d6={evj%q~f+QzTx1k@6BDHYTfUW~;zlNNI#Xxyfr$ z%=wz=R87kF4iE9`J;BV%hEODg(FpS~%+m5*`Y9s7h}AQf>yoI+%L}M88)^e>$+-_; zl5KowY7wWeE(4bX55U_wT1v5j=?+t134dGonZ;*?ETw8q%i!aT_szxzLLSmPeyiww zj*0O;Jp!*V?|%3E74yLqhtD-i)J?7e-_$_FJB7POb3cG0kqP{}!y|FivFXS9_ju*G z9^!u$?FaQgJ6M}%&khi3h}tgT6WrTB$mZW(XPv_`=_#0$4_F77O=WXPQ{V5i7Z>2f z{eJel-<@T@`Rx%n0h6Hy?i`_W%)Zl{x3y36WP}~95vCm#5KbkcO8i!v5gtn8b#Svu zcZg{2jNl*#kNv>-)+jQr5O_)rQ&5HT@M}W@+*f^aBJb_(5e>Sc+r|m^gF(9fwESuj zpkklIfBC21WPkU|PZ3}ek*iXudbO|!H^t&9#kZ_?pa(EpV4|=%QbQ%td(j~RmOXNg zk9f$wtH{7%kZkl2>SF(OsLu*R3wi-g|m*F_-0 zbV>x@5Tt#Decs5$`Yjw>=?gzWiN>BvkM@46)4*3EqIqLXFo2cL*O9#J5-=p(eM%0B zo6jWTs9VQ?HD4x%gDFX*fl02TO<1*FABWLq;C3w3vVaDPmSnMIgK%tuYfVB`X5zk* z`Oh)CP#})?%}bf}A$DpyBD!4}1g8E3P5Z+4zyJV107*naR39NV0ptPSc}*ac%>0g+ ziHKD+lsWz_5fvN`^GlU5^w#<|X3ljqI1_rQ4sxYtOmrFv^4iizY?L{YPlU@ET?>RLz&23t*az1%egDcm5o%_@6{ptjKy~XcpvuCEpCbJiw<|P9=?5v>K&o)VW z5a|xd+-d~|4cV@V@K=I<5ZFlG-r3oOF<{o+K?4I1w19j=&ZBdrL4eP;^`@7jg0%2CW z+u4F>*cJ1?J>%RB+!h}{z$ko~jcMI9IAQH?bU)l?ufD&@eorF4Evl@?jsi~ktYlV4 z#>&1pe1gxKz!5Z_68UX)1d|2~(H@l@i2eecJ6c?jMgc*iuj26ug4XIWf|3!=7HT%H z7REn>0j;iC>rQqb=681TJ^Z^4{+*FqyTnbv_%MswKd}eg+rW5>0rjt&*&ko_vhBmG z?BMWG_7;Ee44j@J1euQrzhi%1W-rg*>Aykv!qUOoE%8sC)8S+VqddWMeg)%fnG*=Z znIc$2$1rnZ!e&EXuKJi~%lIg<93UXMw)-^hg~Vo~8w!o{ZV9^Z@1ix^|I|P|_i3cm zu)k_$3J*X#)R+wrS+RfH7WPIc8@8Ac%*8FD40pFJY*z(_PeB1XgNa=f*}QSHCBKz=sxk>0VZ)JIMWa?EWJn?0s9SMriP2m@pwNO6_i5r_Z;Re4;lg2VDvmU zat9qG3%DZ1Ms3haWJUJ2aRqQL;Kc9H6&Y~Jwcz>Yk;)@{*D|P5q#|c7;|w7yZs~ZT zx6aA6Dc-p+m1_b=*t1LZ zUnKERN{C1-He40XC-D{7>qMW0oQP>hvy|xqHY7F5Q%z5;KtG|9X<{(?5}6!KP&>E_ zQMTL{?~%|BK-JnzV2<)yq&-iNp1ogaL;P+NT4XOwwMM4Fz<8b&;FqkVQk~Cr6Sz2S zoa-`UnV&uq562dVCKN8<;XbgMccgKcIn`N)aWRfVI_L z23&vojsTh-W-(y6PG@zskueGLTU+~>(2hfMX>jjZkEk{`fefDYGqAx%sIH?vPVvHu zD^2FHiGNpI7@)~lkh+>i^1?8;X|7rYes2ABi0?xf(V0IIiL>{6!*!chSf;s0Vw3knCC-ShoPNtoeFHv*4utaK&hx;MYuQ=b|WD-8xm*bOG89nY?{rksraqiA9|K86( zKEy|fT>3uYiNE{3-vupZOy1MyIo3LO5!XRqY$di__K7Xftc)k8QV9M0D?%rqSd)-xEard04VOql^^et}l1h2q)gSpXM{M=&#Zl(@(p zvp*6kY)f5~WRf$(-p*5|Wgb|SXS zMg}RMjBu0?iujH_9N>40?R|YF(+I>&$OeIdiRhD)8FV3#2qPQ z#3XbkijM}38tv6UmJanPN8pG-8_}g&lQ?6ErkEh5Ikrvm&otS!(UO&<>%c(&faxW! zu^VB*98An#lBc(#nuYnP4{87N>E|C%nh&!TbGI@^AS{Gx4kNUGVF9Afb|F}3j22H` z;Tw9uzKhqBg62r`ERCKw8?u4n$ zHF1B4I}*1Xx8D;mV5zpkf&^oTaD3s(92JeK;Lh$wDf{rSm2HxSP+mt%q3JN(H`{u= zovpTjU$qM!jk16Jo-%2Czez{?TNum~ZQMhDjG~U_t2z6?vVS`} z$DuE{f~KLip^r_R8IV39Odw}reNZd0m008+qb)?h7QbF{uNwEVbHg>-yFRijiY`RK za7wmmcGQG&iGOc@W1DBOV|m`2qf2~%JJE6e>cuNpCHC_K0#_hMbd6#jCY#To7dJ4= zi1cL7ygELndq%P>ng3^HlpVbluuoceMrj@~{t@t^Z4EU&^8Dr#`9zH`l^TX#f2bo;-;Nu=Y9F8dwb-xR`%z5Hq zj*GDeByJq(-syhv#oc#~%kw<^EUol!=jnT&eOP53r8O0NwJQ`TH8k^zBh7;Aygc%( zfr4Ez#3QJDFuW=*C6^-@jaX;?K*9n3-(_@UfX{1T|GI{5Qyf~M8k$OaEFzQAJ^T!rR^lb?6YKHyZ z2D_@3uxy!#4RPz3A}XcpU^q&SkQsc0m_8x+0$>W@jYbkFw9iK&YLIMVZec78Oaf^% zazz{vL`olui)E4MkWL}G{+%QdCVOZ1U0SJvbM>PQA&^l8Ldh4l;1j_|rjwA@REKFG z6wHz_g};ym6#3npmc25a1F9Swjmu&qDB)t4@Xt6jLFnsL6?d_e!Zce1azPxeB|7DN zrVLy(XQ)F!r1hc1CNVDvpB%(-I)yNyJ*;4;ef)6)ObhEUfhNQR(ur9KiIB}=B%yP$ zB$JD)#HgehJ_Q&a;zXE2j0Cjncmz0rm;V1BwKm~A(;HMIs2|Y#26V0CRdF`}tp!V2?QvdsmoDqM!nKl}r3gQ_Ok8 z-W3`mYryTWtY$~&G+|}g+C-1GC=PIWtrQJjVv@F(qLGhQT(L5ZGG`DC=5BzEepLe_ zv@mRt!`1|MP8kXGFM?1Eu&A;ZeA*SJ&o*ma;l4F?)Hw<2eL6Qd@-Az9fS+=J@bV6m zXpf*2bJ#Y!TcjbtaHwl4e*BoIh)nMZ40oyM1HId@ey`tDqF~#oHQWLpbcxm^sh&oT zS*>%Ai@Ovs7+`9KNy%WrrRU$Bljlc%B{fN3zq%%J6p6QjRe?3+W`U13E;V?~fFGlp z-@JPBeq1@B_1(hSGI6WTXo_2{5F~L+7!0J)rmx$5@Gz zLg=#mozb4{)=n@(YnPhTetv!)(Yq_k+uh;^@4;+L+vuLte3)jE3guI9#Q;3(?>2$6 z*O@NSTH*cx*UURK3Ewh)GJ1d4%4C{IYU*9VWNbAcg=5?;>_IzytmAHB_cA~5g88Zu zD?qEI*e1%L8GVzkg*3=(Wq#5iu$Mh-Sw-iKSrzHY;vq5#Q*S)SfI2NAO(I3>;DSC# zzy;lbL8|hwwzCLiV@&L|5Wc_(SV1supDWGsd!H{o^E&ZYK}2}VNffd|D-yf8#&`&6 zgayByljGK8o8w!YbBAZ*q<{PR_ecJ{u<<+(pPe&Q|8@*M-vaxdk9!jVk-1<&4AY~d z_R&@rde4P~y0p{rru)K4I0+sDg2h~rUZhu6rh$0CYf_q+pH(`7!O01sFBW1EPLdZE zoagv~e+04fWVKA0a)$mTbB;sq>%4jCnnO+C>pLZkJ)P!{;9OuK8%UWOsO8&8ldD_8 z#?em9t+F4Teez6TRdsbk93JimBA7d9fQTi#jLuUFaNR`?!<7Z9pVf>!^2N}k7o+E2 zf$jGaDDN%Dk7RnJydu#S)~=HvDJ7W5t(o8!N!OA=D77&TndJ;hsYynr=fpJWh^$Ia z9*#q)%f(zEq0KOB7$UB@OhzT*hvdh#7Or*-P}$fB;ZF$jAe(_rCZSamXc75o%OdT~ zKF0A@A!@4$=dswPB`8JuOdb`4B#<>EERYUHh4>U>RBc}xGR)X2NJe260iHEBY!S1_ zf}~-Qsfh_eiOirDt19^Xy!WED9nEtRN!7ezhfG|gbMx~zNFXyDP&>9vgr2?kEFE>r z2Asi2G;X&EZhA_d*A>j@h${T2Nag72;Tttf8dQZybs9JZ2JgkQB z1@RU#b+(A9Icp5a+J6>p?*V7?!m1SOzK?12r)Y((4YVH37T}tkZiS#wV2zg$W(5L+ zuV(lHhIAe1V+LO*u%)#w1BU@zyBjcR0h@P3d{&EgVux{|-LY+06JQ07X(CC%MLY^( z(I(tqxyRrGL&vN5j`Sg(5vXJhPRCgyVzLM0E&%@#YkP^msfP(vBK+WBKZ1mcXf^N1 zV~Zs9K@W|ZZt+?send!wzei4RN)V6uo3CRH!4{cp5IcU*U-X2;^6n-zOZV?FJ<6xy zD=iT#vYNrZ5eSdoy~u9fQ4e_ULH6h8|CYUeaf5b)fCB>)$69F0MgEY09qv+Kfw{hT z{fa##{HTjbs<9M&F)Q+I<1 zXZG+6hN3?-6&o-@6Z0ZWPa1FroVE#YDh{qe0eov}i-%qE20K~*H9kz}%K|*8Gj?4l zGAe1A&9W87t@2~^XuU=~OcmQPu&QCn zs4HMgd-e4pbZKRXia#Z+M54U(hP~q9{rx19w|;J7f+$0*xmg7=JeeG`!WYP#n5%R> zm|@IajSwQs59UGVN6bMgjZlz;1jq>E2ZGQ#=pOI#Bym>j6c6H_FyUav(nLoE-+|T& zf^w71xlXC6HM%^v{y$;&wIo@RCiXp2>#WSuRoy*35<9?>#KK4#Na6xUJ^>$zuf|JW zl2|iB7#6dwN@iuH)|veO{8Y@=4wuH$9TkxgN4S6fY2`g=Ii|%Lx^FQqNbgP$C5n@E z>lpD~+PAnDU=5%Vd@&6`Bdk_?=z1rb;22;`cdq5=j`5ISWpM%USfqr)h$S{D8kc>u zmZek~W`1KndP0s1gT{JU$~KE=B#4-3vn2=tU~=Cy=a2<4-8EUyxXTT~J#*9U=(dB= zoHq6tv3m}8qRh~#tBW-IQJN5O&kN~?6DuMkq-3q>3ED%37B-5LTean})luU}XxpGT zP)(&L1bOqqI2z%29^%}Q1|Hn+m^w*Qs(_@5wcvBzE+ES>?43IFKuAI@fOkfxHlNW` zGa_sf<1qi*Vj3g!tJ*CIEnK@8mdoeJOaQKNYsCD|DIEFFA0=S#>Kt@c>BDi!14oC& z&sdKk$aO9SN||-mT_56VSiaJIA)?(SM&?#9WNE<^nyC&$%bmLt(d;C>H`cpnxMi31 z>*|1>zucPr+yCXin|<@$cz-)7-y0{xI6!oZF`CB!3`C(m+w zZ{-quD^`?X&1zXmp}WcgdHepPh5|V;2l8Vy3B%w%#+=rU*{lUu*={!pf{{5`a>cW( zu&wa$sCj(M#U{~eF-7Lz{oT)H*Y^Ab&`Ilm888vN#skmly{Vb^lj2@KzdxM4iGjXP zh}s<;@nb%71~g|Xa50J9dNkMIM`;^9fRi?|dE3n`Ab)hLF5W4$59lVWbHqF>&B2$q+li_UO= z#&F;Sdfh5pb-#qHqgtk2g+~(;O)x}v%i+dh31*{bYq&ECq=OL`I$Vy%Y%SFJzp2QKzqln^s1k~;cq zRW!d{wr~k`wR@BKd7K5vnj8ILgCE*l33eNjJO=I;{|hhVFlb6WcPol>qG5t>xJbi2 z&$0g?PYJ;&Nshv8-H_dIsY=#MS#`ZJI=tKalMr<7P=peu)>o$aVl+1RPw!)AmlOp; z!#(jvi7Y;|D#4Z#Zl?_HX4&@ckHo#t%PJXAO~50B4Voo&9l&VtwvOTY6qCYWWCSi}5l&iIKyEH~2_tr;M!?ea_0r^5 zPeNqf6|*duKWd%`>+TOm>Kh*-meG&U$Qt`v?rVu1>-B`CJ*p`@ZhD0GZR&oJ#jb5` zglYFiT(nVL7Q`7R#P59b3|ac3M(hzyO!%PG}fl!LC@;FN{=T#ZCW$z`t_H19pkSykT zdzq^=*y?MWFCu2TH2eAZ&4}y9p+XPvz#Jy!#`>_tv{jS9bdgrC&6mauJJn{&@ZBnD zX`?LWi*WcX9Q~=H^{d-F48dQ$+D1est5hqv-4vQXeEVYdt5?rv|L#BjX^LrPkzRi( z^qnh<12>Ugu=B!jS%=Zy!1EqItWBL?tnqi1OgwqjJcE5%Ry85WT^M6M|E1kBerZG6 zl1qNG|DtWG4u|V;Jz=tNQQyv`GG%KlfNpM5BwFG@FLp_|%xWauC`aho_FAk6?dG=1 zMpkz5^ZC0JfCTs#+{c`3aC}ls)*f?Qsn=a2ogPhK*jn?c#oK)p-bS|}SbAM7E`?T+ z{T53wr9xmbj_S!tDiTg&SAulRPQOc#I+YkV;h|LtZ{hGkLzm1h0 zBQY;4%buI~#oXnHepbVAYsqtTRh-y9hy*yia^O|?+IW5>P7pd=LkPJaJ|lKLgbO-s z9l(x~yPhC~1NZPW0g1;=xEqXnzWYwFjyAgIBp9b>%yDZx5OllVch2+NuLYs+{5?M= zffy2!5MLd0L5g=S|jL=n$Ozh^ z5C|4!%FZIm6R>IJqi(U-g2ieYA(XKu8u}a1Xo;4CscZoOyMKo!yjMbv#o+FOtnLqi zEV{oRN5D6=47!aux<5AwS24k`wpy2pEC=zPvB>>qtXpO0aV4vPTTMGXE0#ga+iE)z zalB;ZY_Z=oBet!Tq=xgD!IrGqn9JCrrtyfqnIotW(04I|%Tl?a+y(|8ld&)26|1m$ znj704G0{#nKELF)?b?Bih`V!Wv^sM1XNB8Y88Q4vxnQqa%k$%RC2TyOJ+HRv;(eLF zXKAKc;qOzS@@mh?GG@v@{0 z*?5ls$iTQ zysZ&H@uIc;$0F;AhY-Go?z3^8G9(^=RxEm(=#zzZ zaxyg7Tg~-jiU%HnZua&n z7it`5l}t&J(RcTx7`8gty=VKgcULtTNC+S68(X$5;Y3-!3h!>vXZP3+H=aI8@db-; z1V6VX`}J4F56mB2z~d~q5OzXAv8L{YK?cGu!iUh4T|TZV6~hZ3Y0Kw)ibLn{$c*zU zMdIF++u%H=k>|?3mB=@?IT`{pUeNqlg!mc$gO>g6d-wG|e}yXJ_aPk7RWKgoYn;9_ zKIi(ZM9Y})HTN9n_4oWc=X`zm`|Iz(!`$F7OVHo0oeNoOU{0RL6?~pRzY4B+d@Q3i zkLdBQFb6LKdj`S~X8j`Zu`haclVQR2cjr8$B;#p2)yB$14P%D@?aR*W_i+tj*aCIk zbl~Bh7cQdM;P8;Z!{-QTO-^h)jyGpz^kvc|LHJOj*_4=r)4HGETC?rtPo>t|r>Y+y za6*sqJvQ^dB)R3phLN*~KXK%f|E!iA1cYn_Rh4+8@fuyY5BvyNx(Bd0t&l zndpA9b0dLvZLjRZI^|O2cfU-dZ=gey*O_1W!eVeBFjpIo*k9FCZ3Wf*n*Vk#IU8=u zRI_*8D9Pyl>PAOn>ns(!vTKQUUUo3idAeS9VT|a$G|=?YasQu+y&RmrEjeU=_I52? zs3^@=Q@TeyWPOh~WfZVhoOG8KmeTT&FcZoaCoEXhng*|4pUM>6Zp_!g{&Nd><2fl7 zdv{w|hjn==0q3`W_;$ASBF(=Y+c`&;WFWPMiwTWQVb9tV8808h`A9Ceo0lfNk zTT4~j_CuX#KD`T<%BWo3+f7h?Du#9#UNxtO1bP|KJOC0gHp8i#=5bn@z0NYbTQ!M} zQJ#j!aP-+Oq11kN#kE#jgG%pbm$|#utwu)m0@ZvvL7&h%Yd87p#&{f#omhv6_M)1w z>nz#z3i+Sp;{3z&wmy1Xz1`36OCo8f_|7kPEM}4N!84Kz=w#t2c(VNJ%o9!PzqwI8 zrnY-Kt?Pasn2l#WtGxn4s1ZM1jUm1G7k?8DqU2=jzk!@aM8Oo2%rO ztzdn8_AWY#fwi`Gd3KglNKaE*)>hji(RMq_eJ<2tR{~*&S1+HY>}1o|!213?x~i;$ zI<^oWxQsz@XKl3;#_`9WMqK$Us|#Zvi8ihObqP*4x33fM37Mr|Vn*!(QBqT~txbKa zoz2=mO=wkv)BU)ZV?5yyYxJr_po5clvz@247ySIPtn^j029c#L|-DSXXIM$kvI^o-rQ6Bm%M6%dZ2Xbl*KOLk0x zDMaAq)@?VQz>7l;Vc-4StA{qu7SC=WG<@DlIR9%==#Bv=%DLg1|gCM|AgM2&@|+CKy76K7*yv`jGy z&2hJSRvO0WmZDfy-%nX}bQ>{L#K4l@UEhnC6Q~F;YvnZe;zH~5D8`Oq62=rZE-BjD zae_?2`C4(_gWEQ4P64<};~Uwg2@N}t*m+|;VhCWf(`28LgPrEM5zMbs0vrnQ_4C{* zzx31NEhsoqtvGOVb*7vCv%gkEL*lsov)*oSkIt7JCzSy-E9J zg(AA^;zRp(Q*UR8t77MuF}xcBCfL;zA;qdSZZ6j;E04CzSncn(pFR$E5oH9-){9l` zq=@Ymr&~(_*@|I&%$oSbg3c;BiZ4jFJ|8sn;oxKA ztF2$Sphv3YIJK4(e{I`%Fh-Bm?!8*<)($4_k4IAeH54&-0#PF0R%KE$zro9{6x_BO zxp|F6NmO7Mv@miSnyU^?=QX8paAmt@?wZ86SXy8$TYb3yQs#!G7Vq>u6dD=jt^MF> z<4*thpXog3c5;h5-v99_fBwsw&d+zhanHWC&v_W* z1Mg^N{6xO=1cI+)j;rRODff`2eQ!iV%V>u3DYaO9+yt5c{A%CJ zINQJdxctbD&La!+<7=uk? zW;K%d7KQ&_09E3G=c@}OAZZ+3G#1H3F}^{JTuUCD#VAXV_A%7}MT}X9S{9i+?P4rd zfE@1N?jgHyV-Up7?6icBr4m`B&FedwNbb2&dV-UeQo?}PkGjB7Y#n0jx*%DEU=J(_ z2kwL1p=GqGofM}8j0GWTbWv&Naci7|3& z5cI3TQ&Vw?1dFZR?|%L5?2rG=x9#R0!bSw-7Wjy&5sLlt>zGz>v7$BC?`bfZCc|>LPk;*t6_Aqx2`^iAD6+OdzZ$o^jCM2 zwX#L2E@KCl)|ygqTu;>xF)1A^Hd~j|1mr{4ZiY*Ct~e;BY9rar))n*ADo%WYPPLm- zuvO=pM={Htc5Yb9h5IfyFKvCPaWCgBxG6E{E)DcPML{jyWtRCYi}80aU*slzG??L1 z;~E)j-BiquLgW7HDO^5ZvfRRp!z{YbZ7HSC>|OAteB2i|m*M@Oz?fhR(zhwOFY9Qt zn`Qp--4Db4`1;lJF|N@>fJ>=0l#n#&ZbFN;TzXd1`6sh?Km8KC^9c29aWPiVsF@Ac zvO28=M$b#OmK%O0A)qwFrnfAkWJ{J`LZi7TKY-V_Y3ZkVSe`t|_1LZ>N1t*Rrj%R1 z)0!!8gWErpvVlL0+RhO6tRyvwCI3(W z(AMWHuuyMe?zvN!bkk%pk094-- zfRGnaJw$Mj2cke8fOd?O>ArJ}g83M_aUfLMCQaqCzf&qpi7#0oq3&ozW2|BbV;tjK z0xht14+u51xs-y2-`KKfDtH#hGoH(|KmP9BG$R378MoKD^KR2f`KE`PWC-LKe@JUD zKV=+*KUz4$pXiFX~aF-7BH*LOE#^on8aaZ{ywd)XEZlYn_W!l zc)&rrJF9JM!PGd!WH(}HhY{sYiptZp;f-))BPD7vhIib#pJGneExtsl)AQnRY1G?$ zk4AMZL3hyU*N*87z zk1Y2xJeR`NGcC7HTI<|xBS4P=6A%L)2rhRq*NO5J!WaCG6Jm#l?Z{rOp!MVemmGq@ z5o$F3#|eaw#cHn_=R>u9T-0l6{ENB#k`}X9m7je4<(CwcV%W7B(_(6|`99=5(1;on z+m10WF4;C{qJvK{aQMz+F%-w728MlC0H3>mHN1RQnZe_lmFsSE)!Im=qSx7tWEsWw zJoJ--JgkwE;;NtPA9$rjQUB|ja+RD|{B3Ud6;@6cjTzoG1DrMmL(`RFi ze){R}Yh4x-UwabG@L~7v`3r*KzNpR zdES5i>0@J46yJ_8ZSkX5sI1jt#f0}QPxLr7!e5NOm43Z>+in{@cQY$|lx-!*Bnb`y z+T3N5EBm;~2#};@9T%Ddx1|HWV9^}r4>mtm^W@Hx5jur{@Zpv2sk~$e(AJ0HVa&D| zB3Qvz0r<2hDW3NwDKUI_n)Q0w?#`oStO`_C~xwmqvyKsV6;(pAL7s9Q#7j0=16FCkDlX_rkhyB$ML@A-sjHj zZ}+7rQKBflVA`16Op!)qMDC>X%4abB<@Kqc1nP3w^_oZBr$ER0?`EUFC!a1V&54=%$&=l{|AB07tDQp zmLWQ|=a~es?*UiR4WuI+Ehbl_=R*vHia@=lMz3k1Ww6~8P~YB8Tad^zgl<5LlMo#f zfzqm2z=R=!<*JF9m-cX{`$WSWaX-AUCA4rk|WofE-= z$7fr?WVquf;J1SmcJ{Zt&tHGV-efy=x%2*MT zrrz8Yx@e5_>wNN~Q%&}cHgMczBi$du6}zhQmf2TEkwqHfJ(8~8ik-wv>?KLV)w)W@ zA)uE$Vxl&{6*pLK-$8pd-qy#G#=o(YOS!pmi9V$9Z*8`#cv_rnVdw~V20rA9dRoHC zdYxMCinA;uJq<}OQ2gYdKCk|lEQUQjY35Ty`f55{_e9vn875dhDc%Jp^d z`K%ZZ7by<}M%xGX?3w@Y3Lk@=^&a148ECC_6qCBm3nEsx(L$*`TPdE#<@G4xxe^|J zI65e{w^Ylz;FJY;Q18gaXyBU?Zf@;pkae`00%DgWT{+zU{m*Yk^3dj%q=|$TZ*RP+nhAXol{{6c_v&JR~<^4NN%~LiTgF7ss zA@~h9!=Gc#26`46lRGeQ5EJe@_~s=2Q| zu#vFCO*rwssWjtrS-Zx%W}O=Fyi3h}iV8spr||;Jiy-CFowl)?;OAa_EdwGiNETt^ z?O{VOP$cj?C1Ddk#Ps{3V}kp%-t)iV;r#dccitVbq~Ma^^BO#@XY|4MUmwP3eCUQ- zkzq0vMzlNl1GsSo7k>{wm)FYI$T(Oi)7!JVYxIbMr?Idi9lR|jL(rKYC3VcRXAqp~ zwF$#68@%=*8Z8S(TbvSM5J*Va zeQC(2#p;$55SuZ3nm_AwoS*gTnSd}YxVe~@1(;%Qgw-A4nZ=?AR4Xd3;6R;np6iqF z&!ku{j>AFVdRcF4SrG3+dM?hbI$tPC9b?Ls$o=`OdajF_QD5cSxlYKz1%l455dEcn`X3PKd)?xmv`KHd7qFv+YkU zbkw}w#;jwJb=t{7Od;e_zlcd}g#T;(eI7o*iM0fh#?gfTdP>&Vl(jWGOfW7q)`6Fq zc{ZG2YMv2t3G1!S;ey{U?w*9rV+|o(L7+yc#ntl5ut66+`LDEG+ zGy%`zT~tpZb}0><6^M`<<3%yjk0tP&1R%*0xhQ&k^qPwg-P&2;E=5E6fhGw@6}q1k zb0t(MS;rqzV!DUgK$+pgE&By#;{PrDus+UP8;YkSj?O*lBGW4JV@<#As0zE^S+ zYmU1c9WTcGY2}KpH&cill$V=$%t;$2pFOGVbf?yM1q-l3HgXaDX`b?RA;I6_1w$7Gt{@M1%?-5k2ksc*Ox1G ziT1eNVl%zM_TcD1L%Bi*z7Rigpm7e~h|y~)`Lw!M*|8tX4pvsBrdaZ#Bpb@{;JKZv z?=m)y7g&cmf26n%p4#`m^ZKWb`S;$9^DmEyM^5WB|IM7;f4IuSaqTG|iu>}eEVaAQ z{cUp(_NhGSQsEw6+~>JvHa#Z3>Y1(QG=_i}Z=@P~cWzh2JB=G}?&gLOjOauQ@o)Gv zYT^4~+#?#BWNmBAZ8AT)m&05Jv+ZBkPWQvl@!Ou!%X%ye_+nP+8cim^hCnWckWDeh zoSQAiF~tk|KHv2~;xNGmi(Ck9u>9djfPE;R=D` z1@TO9WFPhS1kCAg_v6yUd=Q=I${w{yu0iBtXxyqdY0GLC`M3$a>kyR|D8tlqSYo3? z!a&5HgTlC^vb+d&V~+g}7^qW{RZ64LY5tz8vbjq-B9t&Z`oMjzmd!FUcj{p|cFc%) z32&t!w-F<^+~V}Wc7F#A=hHCKErsjR9UMV;*}98E&VQr4e4)lrB2Au z+`FHwQkt7=Fqwl3X;!B(JUty*JuIu+KD+k3Y({Y}Y~eoQ;<~u(nac@4mhmbCP9t_- z2{~#B?W-6G%$7^5-%rqOH}|E+y0?`JS>bZozY7WC*JT`Hu;rBwA;Egl$>lZ)@T=cd zSNPYjx=Zd-%0rfyZU9U`v%fj^o?D0k+?LH}SCi{fFX5T7ZUw`OG<1nyH7D>3gAO{r*Qz>*9C;N+E)qE za5s4IxTrNHc=jrEzpKtubA;3AMH$NPf3=aqps_*cwT7(rQ8NoKQxg7DqDkGRROqFIGD(jA&OJcj(;nGofE z)2Kl5%vKB>6LwgeKerQuN5MRDh>oKF;2tk)sJR}?Mt)Su$=f#{6LdP1xO%$BeKou5 zd27({=wV#k-S1+A&-dFpF8B3P@oo(u4h?dZV-$^Kwd}I&K%kUVV!e3aP zEn(j!tcp#KCir18y5x$UVraoGxcY8Vnz{STIerq{CE4j-B__!`M%mZ4k|ONc;;(R( z2TRL9u!+fzbwc~YMccjbK8+u^by-@HYNlsI(ZO)cF`RNeemDfhIHTcNqh4Ph^K<6! z^WXeEgzlGhx4!P}zUyVzE<^`7<0`8^`oFp=EK=DC{E76Uj9!Bl8dN+JU63c>NogC| zn-;|w8c+_MU_TYIq&7!%F zXY_3E4xYUht!D-EMl`I;aYpc6+b%93#?X4Q%w=mr{uQ-RF%Zcigo(r!nO>OtsM~8W z_Z27G833TT?Hsh3QPc|B^&Vb(DHgha0vOwvh?g2hI`T6jA@Lk=dBC@)RRI2 z`(J?p&DnSf0P#VI0Ad$*y4a3+i3y%ZNO$XEFA1u&;`@q=?V~0={iZBD2?PtpRP5Vl zrw#kYiHP0ij=G77*zj|$MOVzKf29Ng_>1VoL@=6_+6ifSwaPl^d>ueovIHAsTPkT{ zy;zI%bOZxFcF%c}TO zOrYoW3~lgw!1Nq$wivL!lR9WzDx*wDuw-X@xt4# zNk>h1$Cyg}T!v_f{w901iz(VkaTVZ!Khdc&GR<+>hU^~T%wPyot1=P`!SX*!ct#s%md#suJDD@B1weh z%zY?cIcFT`2<;u`0vv)cSl*{uPw<^QL-TXd9r{tKuqXbPHS_jQpR=ZdN_ea+NG6~V zjBY=j9u@|d1Vt^EviK&Y`{j#gvz3#QY1)%go#e|WHIgqbt;^M)-e?yWwk9lp{PD+$ zW`jkPn}zl$H|bUzc}>E5&_#W2DRx}6;&{v9vy57N16{3E8_P1sm*C5%_Gny5;K@>c z!Gn-nQ-TyPlh$49g#e!J=IZVq8#SeWXt$EH!UGaq2tq=Oz#;&76dV$nMwkZQ6B``u z(!^0^Wlr?Tf;JZQi)y&xnlZ2>7kOw>y6`W`Gk6cr8Kxgi!o$&cgWTz}->t)ZU5sHa z1ieQ-80hr!+axpk+xOGCEV>@jA6BR}iZ4%IwB@=06*CV0ItEF0x{ohi-<*~tmuDei zuTwfVC-~ZFVu@d~&(tmaX^L}B_n*d?JPH3E#4dxenDS8W3EFt~i0S1P0WXS7Ea(di zQl`7#NUm(W-FbY^f_C2t4%T4e?L$HC`{l}@MqUJ17^ExByZ;IftE@>G zg@AgU2D^j+LIlv6yTM|;t%$@ExgTj9tRzMH7I5`RwN_bvCuI?0FppzIYuQT2F(J*$ zZ?mdLs(Xx=G8=<$hDFo;B z#Qpr?^Xx;yRmS9Y$tR1~DPtAhYyP}wcZSM#PR>8femY19UpL-*oG#|Zgwn%GjSS{|T?ccXAN|bqb)XsoeY&*dth3a9W4PDbj zY4|x5OQgA+Jw7X8sPX&|)7xE7DPctg7YzL@Ccq876XRMAr#4n%43!WaKJs|_$WiXBABv6vjoh9JCjwzTLgy#MV^tm zC&kDPPJ3=HVSIHp_o$??^VVwPmgk59-Vf0n&0nMNAAWk*E*-K^S7tAsJdM%DYkKgT z57jQFoNd(h?KqgjOSH@tcU?Kqqu~7O7vIlz?l)&Y9llNJ)Ih#$(UdW9+SK*g(_H+L zQ&!t6b9FU^Zs%o670WW0Ly2uwI+o3v>odh}EkX7wh$CGaBNzltZDT&8*#x zge>L%B)+qlF>;k+d=uYGeM)((lt|)GYZ_}9@jGFIh3GEzKRj<5;pgaN)w((;Npr#A z-GP@d6vRje?Z@|cX#RX&&>Bkh5Dsx>0waE>(YVry*-ki-%#g3pr-6IhYcEhx^1scO zSN;^O;+ZLBZ7^+*)SI&3?{jx=w)PQhG?DO1P>!%za|}CrME7nLuG?JRGpAmq$%QT`BW5%#%wTuASi)21jxDv~ql@H6 ze5gg3Ez>}>V3LqBl2Q^Hm?+nyE)z7vN#hB@X(kZ?t$6^l$;pgcCg6s4)y=y#Edr8H zTRBacRvxG`KOr|_e1T6!lm(kCziF|C%OLoVSYZD3VXe7aGZaX^X;FRl4A)I*$pOso zF@@(@04LY&gBKHRRfZM8y=1rahn_9bLA=I&-6yCGMsKV%VT{1N#XtNafgWd#aA7|!?zkSK5yKVBl?buBAK{f8qb^P&&t=-DgqWt70FMEd z0MdwK65S(&GVk?}d7}gYbF>LCYl!tNGg2Lv7GUcU?`AL?n;)l=$wJ%+C!UlgdY%>W zr=Nb#V%C!}xTYL@I{G;3AZ5$Sw4>S*^63kJygv7DZF}03Fu{R2Xv1Y23U$>8S0CEwV3=1Jqc3=Ud0Q9wp-)ZY8QBVk4{D4u!Mc;N6}F0q#{ zo@RCJM4U0s1j9y!(7*ofX?;vjXaC2iKaG2>hWDcZL~~rs`ltOb72mzieRpTSziPmC zQhXNsUHJrIw2;NXqHmO0E)ip6eEH3bEI+n)h3w5&GLe|`S_<3aG8Y#jW<7Xsg3m(q zbe)2+Q%35`7yGSmr8gK(41g<1jBR8L_&Y6~hk)uRJ^$?Vpu~`#5i=!hu1gl=Q01s`!&3dSsRA~^O@72@8KD%gdz-2;hGv%{|)9i zu9~j<`tNbC;?TOhP+&)mZS*4R8!lWYOzzvyab9MH&cwQ7D8VrWy!HCwho4F!YG;(z zV5epT_{fJgkiKE155Y^xuC6epiJMgB?yr9J?bxsJTE$i;;-@H%< ztNEdfgBz9A%H_(EZg{~P|7~2wfhlF6@enQwJxygRMw2VMU0VIRkOxhzFFr-cQVy26 zE(kq!VZ+jk7mtGH2$N|!7Nmhg77St`b6!S{1(&itwB$x}7t)W~qZpWn51(<5C%`P8 z$?E+#vfBd2G6@_g8u56s#QZrIkOL7QWY;E!hE}y$9okhv z`0FetmKHY+PqVHzeDvZR;-C;h!L$Q%x)-;q-Q@`>&tZwu#wF}f1j5UN4x<*T_D6@> zzR^#V0LT)?$kuef=+-pRyW$=^wR?NHS80neIad=t6k|o-qyJ&|ypJIeWP-rpcG|ea zL|D!Wu-A+2a%J7cTo9L-ljIv#Etlw88ucja=$?9kBKEOsL-)D)A{;K8+jas|>bn}k ztL}&B#j|#D=|1S>(z8z*_f8fRm&ZlVd78DcT^Yu=)tv2j?YsBClq^)g%rw5WgSz%) zf!*dV(RY=3U^}44HJtue|LuQ0+k0M}X1}$-xsS8VvdkA6a}XL9$Yt?Dd>>p!B2xEg zrMpd?SiG${)tJAHhO*Dufg-rnzQbQtsFb{)wWDO$&^a|qEn*A?2^4JO7v3f@by z=$K+IG0kX3pVt;L7zQ)UCojVRcXThcm`re*FmUXw<;BS}v69E;+4KFuT;G?(bQQ9# zrf6V51nqXhZmV^)zv0yAzKc6FSYXlY>^>S}J#Ld^TO^?m!P|81#c)?m zqqzKP?Ge|z{|m0wa7N01(88GFC#_esqr1$rrwP{-g{v&5Wgd(8-K6NUP~#op7omp7 zef#+7aLul#)S~&Tgbchq>0Ytl*`t)|t2`p&+>&#S>#3?S$zTjw$hJ(QP?JSlZYVHn5E>da#a8D2pp8P}c3TYX~DQ z*FW=A%J3h5rg#r zW+$Xk;L2sf!qC`QD=v#C(PS!Y_TWB;)!|@>H3>Av#2a!(;9N{F;`hNdzBS)$?=6bhv)w%A!rK%Hg1 zSmy0g)>(AiGKBO)1TnS)>btWDRX(xVWJD~scaElOSBK>Xx!pCg5FK?|JaS97ikwL(d9Nr5f|)r#bqwz zrG(X1F`CQUv)PB!vJbhxTo(+&mI1dxAg)bdo`-J&@EVElWgTrdmzC!CO5JGLgWP62 z&1Ww-Ybd}Ks9ux@U9t@7$}`xl?Vy^LW24n{ufyWj(h5!@~jRSP$Gem*?Jkv_^ltNJ^G@Tj={h%Xq@TGv6s7$b@TRpZ4cS8{X|F+ zHU#NB6P+6s1;L~KpKvz3l07KC$(v(aqm{?S*E}x%vKk$~{{F?-{Y31lc10Lu&Iz3MLJ18^sroY$9q7`Cd z>CLxFvi%dw^0NE&L-ea@d3~abMQX{mmx6j8?h<(T=ZNPu?fIHq6<>D@g+5pV$=8Q9 zngq_Yrt{zCYxe*8ZCcuK+Wfb#`LD2!n590gGIJ>mxkd7}g*U-qX}OqUYoPglecFOW zc->|S_gP}~T?`}ihVJhY8YvK-!8#iwZ;i*ilK5I%f>Xct+27vr;kt>3hI$?Wg7^i0~+ir(t=m*xFY%dqFc1GuxKBqH< zoCzwitii|y=@SGke(~_`$L+^#4T+kd35}3e*CIBAFobTzAokP)8c^3XNdu8(+EWJt z(xzN*60V(3V$8ouA}B7rxj-E?ObKtv53(OmihCVo)!f9$7ecfJE<%jU+9XIGN=ks} z=$8cy7^9vhW`KEJl@wx6K^m^EA_DMp=8(ARI%DpY3wH8*H{KSWtJwBPx5W>&e$wMl z`!USG{O`(uRPLa)5SI@=Y3|nv!n3%+O4n|e*(;{FUWXTq8DTvx%^LE_Mui-Em{vkl z7UQRw#$aj@5V(zmp%6-u{6ld)zWN~;!8yUfYJ3PmZ*!?}SzU&Z+Xa;MmrW%KhPjm+ zE4QdD)VUSl-dtP5LW$8`6c4l3dX+A>-sf3PN4aPhVn&}r($6veZ(hBa{Y_Tk@>Ya@ z^?6*om3DY`{GrUt*0txK=F+o#1ZL)$|P)Dq+rk-}Y#5?b(`VEDW^_N#Efc| zT|GM0a;iO}w6e@(p29h8@K#cIURF|(OpRIC9inz$G2EnSfBP~78WbJlXuU4$->IbF zQzbl?xyH4>T87NcO^mdHmf3Hg8G>fY5jZFv`SYpu6aQnET22f@lSoV$~U!j38WtvcWQm1Jm;Ffn^$ zjwz2MDK(Js%$~z5&pwH8L2AJ+aR!8+WezKrfPXCVw5%%GnhHr=js$F3Fe*oXM@LQ3Nh!owOR zoKu*iao^#?_mwRz55Pv4LqMd0*+i4}a+`Z#BP~`&Db3})2HPXmnJ|puEfzO{z_NKT zT!6CZim1i0026|8RX9v!5MAdGvV64TnQ6|tyet<~x3CD#xr80<$h{$}@5LDVaoih* z*x!z{>6TQZ(H-KvesQNUdv#jt5vJNYsYp-F1N46PAOTHn*_nD%wdkKAb=nHA}7<@MmmV{Mn(3@-SawUG-Cb_?T zvO9Z`OHHEy_jsEHprzabn52|wLH9U?;Az70b%{2*eQY%M^MIe68CJ(=JdyC<%~H_9 z+tyw%fmN$}&q{7Gam@1s`1<;@nDRt3EQ+I^2hX3jP0>#40^jZvmKeQ;(d#|u_48bk z0r?_jbh~zbnpzj^OCW@=c@Ks#Nx1X4h)wZ&9Mx>#yz(Xm+6%P~q-1W?p!@0G?GO-e zK77nIS298kyD4LoM)(%?wrfYbIfR&s>g5Yy&N?iO@}dN)u)}e4xkY<1>^WnU=}UO{ z8;#E2eV)J6ElNBaHE2DZGK+s`mu0EAVdF%Dp&J*0OLM1u2dLpHMDt1vHWOw$;&fR? z$8D;6ma=k}_rQUdpi<`^CFsQELg$fOX0Owg1kYkZkP^;Hl+*_PYt6xWVCc5-8l7u; zw2W-U^|~9`S5jT@S)K{^9P>{pmX+F-^skKtzTz!;)_?#+r_tj0Cxm&V8|S?#EG+*fTVrzzfkIi(7wNS>6NwjoZ6%3~|z! zzdq*c=6!w;yz}Fq{(Vw%=D#`j>(8F2R#p~0LEWN7`|>R`j>yXrf4d(qV~eLpkfUZ0 z%;RxUZ2TttA;>}qg3A5D#K_XZ^1t;`G7~O)D!GL}8G?(PI6BWnsQlB7vJ+$d-C6C^Qsn~NY?`lP zJW||Y_i&f72wS942Ni%=4dPYY7Z%d7kU4Mg_VXKi{PoPhF#tjMbV;|v=tyeQ0UGZJ z4?#|DQ_P#?G5}^AO^apO`IoI%_#-6FS4F) zg70nPTr7iYp>bSg0bxY?c&;{YK7Dh&O?V;Hjfi41B7!Ab1 zkgLWC&a2g85sHMuN!HIo)>O+|^2hn?N%6SH2~So~JRl3F4S1h!&Hlwd|9wrXw;D$b zxx|eYVz!#VQJ8*S429**f;#ISEyuK0J-GsU&%<_6y0IIl%mh34({QMyLst$00!6qA+&B%U=o3^jMn zz0qXD95ewx7K;kUO?+!RI7?=w?CgBpT^}V{#t8nyAhx4ve9(0?c zwpP4ZOu#vqCq>z=2=0Rpxcu>(5eEvo-bb2!cnj7-0mip;9W6xfddBLCL=Z{7!gELr zP3rFx$O~eF2~-LRVW`d-3nWDEhpP`Ch_^Hc$vC_)aCa!qjY;b@jpsGbzU_QcQCS#7 zreGSad5_p;Fx*T)5HvzH+`@2jz9SDSd~`kQylrJ7(H$OyCU}@w!ZMQ8Ky#OR%HUny zkL!0dt?pTr-NERhS8(GAvVQL6g$GZ3v$wxEoIf4Y`}}Y3^Ur<<6USeEKfdgr;jw~K z@hOV_;IIjNUN+?wviO(5mntAZC5tOlp&K^e@U)q`d%rh#cog0b9Pc|u&BXgX-)Uq7 z9^@KVL>kVAckVZ7Dr3rw86ruO3Rd|LZsbJ^s{Ani7V+c2o)1YJ4w1Dff#kAfT zCUSEih`EL>1Q(IS0{(ckG%VYYVIWtq7~=!v#&{b7$`(8;fV|o{Tg{(KWoRxfim}l? zWZfyw4sBvq391CzN{Jau3C{t~@M0hVp^w0t8%s^xN=K4MTg7!^Sauf3!>Ps4gDsw;cSJ(k{Py{aww;b05cu%lexAl0bWx;M~oM z`qcVw#e69h*D>hbEQaSXlB2q5$ZAA_7g==2m*Gf)Uy{SHu$u=$J8RtHBx|h;LLM91 zqK^pl;A6X4WMSTzW8=TiLQ#9h(q0T7wYgi*Qu>^yWg%hsZ2x7h@U6xk-Zf6{9b$>o!W$*vk(X`{>0V9B^{}?(_VmIGt4(@l0N&+|*-h zvQPm-qU3o#FUM^RbqEw;4#AklGm`kCWm(x2?X&RpHo8EI7~$xI6`k*wRo!XvL)pwJ zif|x)@Ur;byASVEY$&Ygij{jjEbseDepqMRu19wIXbfDZJTto~O+zRTdQWl5n)_6| zP-g0J3L6U=pQ74Jo-%G@T`x9#8=M@2M&om0{ww{au6T`mFr1gMO)=gKpIgRJyU6gj z8;tPIdEuR{?Wb0u(1G$F_YW?uJ-X)^@^LP>2K?bncn3DtPEGZY8)G#8^gn+o}VAK3LZ64Ae{6J zrr45TJZ&w0G;Im{j;hhz<}Zqo!{3W_1{yn5m}qkkg@zDBvvLluE5Yi-VBR;;w5IRI zHw0?WW%v-dc=~|hm-~X_(*N`?zWv{_^%__Uh8Bu7CAuO+zVzzF(q;*jhZyf5{_114 zOI;V-_Rwj^W_Kh+V^bxUsO@Nay{EAU3<81)i^%Tk%ebC)#J_J)BSGNHwYDX?i%G3U z93ykJYguf-beG0zbKH|+CYrN~1L_!|0rg#OUAqo&SzXi@(eCNCf4Pe29=gYJ2)mG$ zcox#%Bp~+6l-m`!Zv2>(?k6(eq^u{7i@Nk(ixe+Q_{dPq;wkR3w6>QUvH3yD#-$eX ztOSGL*oq|lYMOkVkkL4R^-SB`$US$Pa63yn+Zp1defn&4TJ}XCi%CWB3k8 z_Gy~FvAucoezsl;`pSBnvDTOH)4O-g_u1^e{Sg1n|NQ;zkN@iX;M5w&s8?(3u$0yq zMYrA1huOyxKop~Ydi!p6l<-i$xm}`wLh{cspMU>f+Pw9w1eao`R}t9XzbSrrlJJiZ zZkKc4v0QG$l`=~0b*b^Q7E#=amkFt7ZTIxAUp%f6KuUg^2;z#MobTIq>?+ub zU5nL-O=_B7YFx~CD_3_yuKQe<4au56%e}bLy!TSF9%Aa(EVOV+Si$ug-H&b7FrPpm zi;$3d+S=<)Ny5hVe=J(!)e>qwUlI+P@}x*K1Jo_1@)CI)(% z`<3;(l|m{ee-&H_L-V#pod0Y*ycW&M!aO7RD)evac}Md6T$~g~Urr(1PXMQ2<*F5q z;&!LNuBA+!G+to{{FXonRlDD0^|BhrCc7!Lc%l||G1h<|-;6O4&@##~eu;cjZ%$7S zK|5`P7ZTD`N{L^-o5EP(P51VN`A)m^q_V^x+}lPDls~87@3O@C#6E9i$u7Q3P?jW@ zEO{sdq2?7X-QPdy+IVvJob!Hd5QTa0IqYU+4a36Kd2aOt69KCMGK%q3kcDM78hdPh$*J61%p8ZQ={I1&DHS5l5wuXVldwof(shk_GU9T9QOiu ztn}g`@xwR^b06X;%DhYbA+ zC(sE5nRiVv#Db91cxlUGmcy*?=SCY~APs8_&|)ZQiMqqwgy$V}in?-mL5*rV@QLI95KN+4hFbfaiR;!)Fkj{d; zrUzXeBaWS>S;^wG@u?af9WyR+XDd3sYte1xwA*ho-*)UI8+LacNOwL+Ksem`v#si_uCR<4r@rhmZh<-N9pq6?C(Fknf>v< z|NZRS@4p?m5EuqD@9hY|bsHSu5?H)Ra2(Y@Ijl`^vxrzf&9NS&7cn9XRc7O9*S(9- z4yn^IElsE+(+D&Oho_Vhh0zZ&J{c-4Rm#Dm*~{FW+l^E9-BGx4opxF2cC~@Ih;v!r zv~KpM#3W9$uDF)Pn0M3U?TPo@^Ov)Y+;2a<`!tfA!2KXDw%6|IZPQV*P`DZ19jAOq zI$MabN|4}Q{`jFi^SakUZoJX=FuKs+^CCu$24GmJ9=Xh_Jxu!Yo;-w8Arg$-bG>AnU+qd;m>*rUM=L z>~|TMI<5?FLmmv@o6~>+MxTP9Hz$h?P5X`D!$(H#WA5*9eu}YidY-yy^r4}^D5eg6 zA5*fF8_-;*Zckd=eGv#f$5=)er&dEV5aUI(n%cYexLCHaQPhUj)jdbjQLcX1a($cE zqY`6Wi{>9C*fXO0TmFIhPoW~7H*R1hS3{sD*TiDcKQ}BZ2|Rek)}uW?gPrSu1`N7&uY^{@ zP3`PxGns;brlG9gE6{5#3dhi`+6Aw!1#85 z@7uigeF8W`aWHFcJP9lNW!OdP~ucN)cDu%hAwR~4E%d^(zb4r)ibF}%p zdYWFADMf{ZN}K!w`$NL`WY^|=uFuYW+p7*K+l*XnnmmG?eo{PKTiDe zk8{2JuKv(9L*NDv?o#m^jrS*OFMibhoP%auV=M$Ao`Lz}KO4o+;Woxhs4Iz}G=s}p z+X*c^wB6Vj#hLeI>?NA_2D6mG?HTTgX^Iu1Wi)H2`q7;ydgei5O^)3f8oy0?H}h!O zxcWLCV$5qP(rCZSQ?MrYFNJ4#e!91#sfzKRF*^45pOggE zt|9TmoA@GljJRd+U@?KYd4Q43T}?44iQr{k4)61qa~*#7+52A};6ALaI4Yj&TIa&2 zkwADW*{<~px8TGGhmG}feta`w$I>fCQU{&zg&7Mtaa3b}NO9yY&1Ub_I~cj(jf-!NMV#4pqI#^^A=u?te;8*?S7 z8)GaMBBvd8Ked3ibQ*s*L6aDOV4?IM!GeIKMlZx@PtwR}K#-J)-cpbAyYSD4i2|^5 zybrfrnxU*ZajE(5E*Sfrwa8q_L%5B*&<<#{0P0@cG6B!izAUuUd~ZsU3Py(#L^L#t z0G}WEA!c&VO6^)mFaqTvu~?Q?L-$>e5h?Wc-ByUU%k_a_=6aKTw-fR!jF*MD5KP1o z^uiN|Xefg*F85&&J|vCF_&hdC?%eTx1f#l?vfL>R+n>HnUiPHbchej%(VVYZY- zDEn|dfuq-~|2_R#QKdncXw4-#6}3y+8J7srq~KM=5ast+RI7ZVIxONp^|vx#}s z#%?8Me;;FFB_Gnn8{SI7@+6quRZRQM^XFf(`igaJ6{pOSImo5)zO2L5T$VfS%COrO zO?r?j-q&Ar?Aynp>t>-}gpk!+d~UC}?(yMimQ7i!l_(I*mkFsKs)>91sj`mds(svt ztf}|K#x4@NVgL%uS8KV&C>-vdTqhJXFcRV3ioyS`HG74LvH}yRHo9HNox1cX_fCh- zHO7L0?zC<+d<_QdBoBj5;{aHr(i4{6_b;9o$P^fhyioY(weQiod-rpffe2p>}axIBZkMdtD`h=u_a-filixopYOV;h5Y;@Dfdiv(W=u-UzS1DPibEE@Xz& z2X57b-FDXba$$#q8f)95k3u&IplPp1cq-_@!KTt2-27@wFt4|tZ2Nyg0e$z6R@GMVm2_bJd673(>y@92Z_#j*h_Va+nDaGf8nn;+9XCZ%Qmz4!6@a?)HlPVac+bkDG9oZ(#F z32SI90}mRH9;zY~a)p)rkr!c+L_8NM@q!q$Coj0QdMb;#AuT84Nw zlqCRllo|CeeI_iBts8JPd3RgVo8aNcU(w~HiHiq9F11t|8#^YV?s+jO+d?_NE4y#8 zpBM`Qb&}GM_!D~vk-dhbRSa)I^8Rx91`Dk3A;4sBy0B*(+OGP zu8A)!WeB9PA#gl~D5q}F=`mS9f52{WMen#29kx}GkZXb zBf!lCz>kgypbGb*x)$ox*!8>5I!;Km7};fgPk8OMbHc~mgZg@Mm8@hDEE0kd2f;S0 zZ{@Hc10!W&z_n-k4MRA+E0HAMrg)EMT|}JXJ1i9G-J9(%$W?P6g6<_4G`9vLNkh9a z@rB}k+y}J$vGHc010RBMEiFXIiv@DmSjBBGTPr((ToBR`x3Z0;T+mf~&F*$qX9u|n zKgG;#iS*l7e>MC5*RO*s#Eg(B8(fjC2Ps*nI#N^8#nSuHp#^qhr=aIM~--+xn$UG6ACVlRQm3fCmy zv^r0Wgw?lIVo*z0EDl`qNM*5d`*RO}in%=sb`+w|#e=qrH)}*88+ak+b)T~MtZp%T z#hee1KFvO*v0ug%uM>peuf%36h3Z48wGv)5dss;TLK4X+c610+$-QEmxtJ^RS2D5K zIL&2jRvIEpCK?=v=G-9dS|S|rDNFgV#16?FHz{Zf(TP~rS#Ta9ifDB(F%OJZC#`-` z%374V2;I+K=bC+0!i_SW_;bl7t63pcbGDumiVi-!kFk9z%ujH^K@F){r=ypt2Xvs{ zuiqyo6e)f6yXSk&&()sHxWrB=-vr5^yYNd}GTnR#B{V=NxEK5-G#oO1^(aA!YVu)!AC;9Py`N*^UK(b(>)f4foiv-~wLb z5ojL>*L#0PtO*_xf9wol(w$=wx(f?QhL<4g*p3BKcYmEZmSaRx-Y=WXL&)_ct#UU@ z&HbqaveE#HR-*KRWu--!c0!*C_U19Vp(LCX)SI^?h{53c?IA`@^CXF@w zr6i6l*Z4HA4DJzjfniX9WdP(Zk9mU?X_9802X z9aEkX4z`NA@3~yjT#%c^f0h$oBE;NO>&>6%_9#J^tr#BWicec*J+CAb6!4#)*W zy?k7osnrH{f!apqx6cz#oF3XMcJAxaj}m zpD|9@iTMP*Ap_Juv4AG=F%48K24F0j)`B{vbnMRh+AWSGq%B-Bm{lt?l$c`gPSmLo$l z;Un2Y9O^2I>81(X#h{Ch4@N9qTbw|e{#xHb9snC{dm;|+G!j{-=C;w_kJGxOk{{%z zD{qbg8KNbeW45xQ)*DNAAA(<2q#e&~=Bo3$wpd!P={T>uzBw;o0;F8;V5pAKE)kM0 zzynecs5bpwerOAy++GlRnD~upWQ7ISht_I6rYBalRMz35@4CO3?`j0j1$G|;yNMVz zyry{{X99!OBiygKABUWl0G~u(X2(@gsZMuyJ zU+=YZeawAxad-AP0rRVGU(9~{+uw$yg#UD3ipAI$u4n4^DK>cCwds$Ka zzsyZmvQmWhJSz`lrO+I<+xbO|2TpD@4i0@gu`79aUrpZU)_E`CcG;TWveLsLu%s-U zB{YI)n29)Zs=-%|x%5Lkdr8>pkv=b+uQ3mnYqQPv)G?Je=*8Rl;1S^F@Lp%TUmz$1kZ=ij`dEDX#irD zS#a?n&)SF{?4V=JXod??5*uaixSH3ic#Y@F4bT?RIJCYS<4mc#?eD8_QL~5ZL-`1k z@Z91~Z|w8tA?D*5<~BB)E-@}&R=*#Q`KWuAw8yiw)^(EmgiLg^iiM49H+zOGc+UWH zaKuxBq-7rG^w0Qhe9=FiH$Qy#G7jRxJJ^4H%+DDoeEDIV->HP4jg&omK8Cp^Yp#oh zM>K)3QSriJ`3#{lZ`?vc%r*X|j0_wfIO_rNYt6XBdo2f(Q}M;VE-xY?==^YaxI4R7 z>oASk@2y$?HKV>mb>`z-@7-jaV!nMf{o}*9KbgZ*coSZSX`LC5hAgt3#M4|rmXEvj za4cVtbZDD>Hkm1y9%7qS2PA=@G`l&n0umx16diu|w|XCqa%n^?q6xs$!ZC$6LXMxa zQWTQQZrgcO!Uoq#7Q{%{X>3br*$pELieLR7G}93?jEUMPw^0oM468DPz77CjK%c)+ zhwa-v$I`^?lsyni*IYkYJn_BZp3tjugNwv?fSMZwwm(b?I0@R<`{jpFMh6EG;BU+m}f>{E3ZS z7aU1IE7j&Hzj){~i~G*zv}wzTeJ5eJolEby@tzbPSuXV%a!Auw5R7PS!P5=KP7JI{ z%yBmaKIG;sS>-mw)4hYcPM=svHewfP(KKHI=-KP%v$M~3M!%Rn3I5-tsXs1$_CNj) z|9bYg-67i6VOZw(#S({x7rZ1SVdOMf+VQrg1+D-8`M3Wut5AXXeYIgnHB|m~_TAFn z?3c?=qn0r?SZPm$m$i0NA+@b=xS2-aK86OT#3NZ_FP}Y~{q;Zl-E1S=alS;B&nZ-u z+$HSFW^MbQ>tbR1rMT<*a@+Xx$rk%e`wRC@2d<{=ULMSTlc1&meJ*k4A}f49!H~|E z8)aekSHJ!J?0^5$-_Abgs{M}QQH)Kp5v%W4JI`kC58n*$NhCLW5z}5>%#zDuk)D29 zt>a!bnXAPuH1dA5*K_g+tcH)=om}mm*sAr`v*N}Bf947%rg%`SRlC6Dyb^Z&zzPT& z=jZ|1Tlci`7y??D4s<%KorD0=*T40Ydp6;*5+1KqGNp`yRhY3o5<>`t6B)-Tr*KgB zmd$7se&ZXM-<;MxpK$Q*H8DQ?V;Y<1!$B<{#mZRbd;2oO?cY~Xe2j2dHqGgqZ@w9V zPS&jJJa#ZQk8i;u`m) z-zEjOSZ@j`hKhH%zw@3v*5|d%-^Y)8p5_Nxa?!(Lip*`yR6JGb%u${UFfcy6bV@Lp zgsk!7k0ary#ZGO&(%BfBxoq%JXf})Mm5Zmcl1|1{2YEK zJ*FKTTJx?QYyV~ajpb`xnB&A>zRv}Q_whO0a^3V|b@|K~n%Yg8&!|TaUyK{~vnvoK zj-VmIja`Q5kSx&&WwsxBr7#8KNqB|lgjnB=CMI2{J=*-YhV$i$43h9}I^g&m&r`&{ z7+2ir#yia!6;5**u2^f*_~uk0?_fImCV984v9N4Ogy?luYz0ydjVbFzCzg?^7sDBn zKP~}r)xdb?);f>r+sdcbEVIJ^1UVqP^#hdC0uwqcEX0%_V&WVkqh2XSulu`h5-Ty5 z^Xlg8Q8gj`&TOMX*p(RPdI)@Zcr!aH?f&ZapnE2S_~Fyy73TuFXWk;55Os8uh+*8G zMu^-<3CC@*ih!LyTe^Pb0SF-mwVt)ZH6?LoBa86trUu*1YdNjt#pCC*zb`Iy*}d=V zmv`OoX+8J3`4$s)8(gmtzjO7J+)NmqUd!y$-}FhHTuQQNTchO|!1JB{Za==GyZ=12 zyp;&ho{-BCAAz)|7OT3ytIN{ktHs>j;UY?NDVC;VjNQ*yV&q!7+4mWWo5;Hb; ztEDT1XeWn{=Wk|j(`NT7fPdDUo~%60T3&3I^LNRO(zd(za+)1|=stl^I!X)Ia3xYDOfFY^iIKj*4H6flmha*KYTy?eXkaIcC*uOT*bxE z1kbOsC?B$}R%#-!cHBBWl+n7}nCj%SzwxS?xi_<)KdDh#n?1cRV|C+d_Tk;l?C;-B zyV2W>R#H| zOp&7n>v|)r^hiWI!VoaDBw;wlCifGCP zW~tzuzx6s-J0U8*_oQSV4crMnmOlZ3hPP7GykoeSJYiycwez;Xx+$ZY1-(|{m(8l* zzdMW<;U$Du?)Qpl_igl>_5bq^KaS@lg2(lr&*9&4Zs9UD53|}6B9gi=P(u0O@NEh~ zo{*EaZfdjNmSDE?WMk}Ccwc@*s%mr8va;5Q!F?&$weS(4>9~pM=^CYV-N%IV#EV+H z59(StABg?hn(QnWJvZ_smLYBBZh zRYryBH-&_g*l24R?Gj#i_o&AU9SGiw@Z9|6h&a!8YIKL-=3b6gRSXbf*4FP71|o#F z?z9@wNw5^!NqI8u>F+ZBd+Z9?P!W@@msXZv#<#+$!Vr?jZ1Z$Qo&>ki*nDuI1SdEK z2RNl3n>%|1eZm`Cp2diG6>Opa06+jqL_t*YPN(ektjl{j53FWc{RCr%OQVy7#^k$h zvj7L-ID~q?kGzyP2xa0Sj|g~B)KwOcVbl2I#RT7U(d62I2%}+Y1GsAOSq5B98pLYj zB%?1lGYJPUZ8+&>c7TWQOBIk`*U)=d6cI(E3`jCMxhcAL56_etTjGp82)os|u2YRe zQ{9n%oaTESvmX0&bq|)}U4&@U(T9+M8OD{MriE`=qh#&kBms$e*}(KB0v%RPz>{_l zu@vY&wEf94&86#FE8)CZiZ|Ar9*_*yv+= z)=m{%UEi zw6^$euoR!w^gzOlIH4_tj;g)8%_3f}RhxvBw2!eSTe&CoD&5-LPdKb)?IiGG__yH# zbDA44ZZmpsY6QNZdZoXWmkda?rm{Y5&vaAEE;yy%9AL(tEwnzQ`(e%`7clG7uRN*POG@_U=d! zT1z-uv(xaMX71U90~&EZ?@J7>5~CDfYhkPp){?)SXI`#-8?Gpezz>|`H}~^$AIuVi zJ5Na=L@2e7>*AyCQXSi7f?~7A2*Lq=C*;1`dKGMzSfIIimirMZ>I$9X-hcDk-;ZDh zXC5rA6bWHg+j;mBFv~euEMuK-oHr#F(S&ibQhj$BEF5>ueX$4^ckjd8!Nluf&5Xx& z#>VSomkTaOwS&W~<6q0MzzDvAjdGd6hhXJi82%(b_8AE|z>z{Ue15+F^274;T<;za zF!A-nXZI9B>YF*+Tx9NojkW5snYUa5W4deoHQ>IF{|UR@#Sf+jXuOVLG!|n#Pjvu= z37+G=eKGgK`~0zVogrxYh#c_6-q+f^TMM_@6(bxlr$GK_h>o`^WY96;HcJO^myR$ooHR==04>1)WV6XAs=>-rt0sx~}jnnFbJ9X;~xmf!%6^#3ywQxT<@E zO=}^|c7R?@7)tw3R5bX;Oye|;fWWI1m#)yBDIL*8r1qe*`#3>JJ5^gndsRQR7V{uH zr`BwOy98mDPcAG87g|v188|VWh;7^&5g!XvqEC^Cxz=38^3FoqU(zJMYGYEH`$Ce7 zh=;`s&}Rt-TFhnh9k4Vm!g41j%0dh@Q@U_`@^Ru1JJ-2eLOQ#=Z_u2A0VdFjjTTRU za;@z3-Qz5ai;7!cpT8+NqJrg}G`bjRD?d#Rj?-R8fe87;GF#TNPSt1SN~|8M;RTRNHX}>**Jm=h|xn@st8)K@6#r$k;`^R^R_uK5Zf;?HuEibTz zMlAUdw)xJk*sbYZ0yWt^!bzV>UWFdMSZWC&oBZC@xIr?`dCVH~yNa3d6uhY5{p>|C zp)A9b8i0S!s<p`}tt}|OL79xC`Cu3{pMIM0| zT~qtC+HMluY7)Mft69+^GQ`tSFf7@P4$rbsv*%dOw|VoGZXSFSS28h+E_aCf(i;{^Mo=57uP z4_NRPk8xl81@nQ+3nQ(*Ghy$0@Z=G)g%JV9s&pSh2>`0 z?&l}yp;((lm96l!N}$f8ye}IO>;?-iGN7^-sOL*kdz?pMtGd#)XyPtGbWjr1s}zW5 zHCp(ThX_L@2!$6UyF3Ve7TCjl@f~>sgdVHVIdUnC-#Nk~gf5u)&UxnRv+qG0ELd)H zEmqfON)^}%CylEwCPMLXPlt1Ev+C6U&G~W3*Cq(mD-;O;JWv-XhjTgqpD#OzylynF1-t_|m# z?c8J5wCD1A#jGq$=fRhLACB+J=9baZjruNu3psy%G`@8>-#i_&@%Ow3yLcO+SV;db zN9X(K8OA-9p;l&6^G!;hMMrvDi)iu068p}D4N{9Ci+tPrdD^0bW!4HsRAm|#tGcVr z5RJv8rjvL8miEhHI}gAXv3!&fV*N7{i$@3C;t(^~G~9r96B6Cm@OLeEcDlzhs+F~Uo*zbx{a4nw` zYzQHijB)F?IPKfCDawN5UcSl=beVvd?(fZ7qw8TXEQkQ4bIB+s31ybyUa;M6_w62+ z`!7M$v$iUKxX2pcuC_`I(_R|PWl0!E6@=es)$CTVk4fqzA^wsCj-ltet^0~Tn6zE@ z{b=2r>!Z${-Q@|iV8Dvm%8mWM{JVb~YwG$w!QUFWc6HXndUAH~itri>&62m47b5=9ifAzm!aK zQclC|QLfZ#Ai?IcLVO)~Fll=_E^|tBh0DKWDcejHBKNoxq}%~6&{_c_QCyl4$C zb3e<9zO&mxTXad6In2%aSl68_eIAcAk6fDx8ayDzic!NC8$(}|u%zVZxF+DA>K z*M+&kXbhv}h|Y$YbS*2NyVGZ{5P#?wxpRT(hx_7rt-o4NNnfl+I4l|Mb1-lX7akg= zH4!2dLJZQ*HQ(f(vSIIKN`};b^tWHVuDcbKmCiKzucR>^g4F132H)?H74IFI&WgXverZ9U_-wr;15_n_tr zufF*vmuCtOMLPN;WIXTTT66Qa`@R0@?I^j2mES0`fAJz5={iD3y!$LKhpse|v&<7- zDuY@6)*pM6 zWQWUgX=#~&XpM2v1sD9g@C)a22SyeK^40IiBn2&+e0(wek3BEVnNwKdhB& z2ub6Y1ms!n;T=q;8x)siuG_oy=;OXbq%1{vw|bBMotkzVUu!ZW16-dNnEPx|!f5L$ z;6eqCu%l6RAt90SGKN+HQTf#2VfFOG*`tWXP5B?Y7x1!0B|`%(6lCpcoE^|90CVG zgJj>u)cSi|lueixa-%Iy1AAzqZ4tR=#ipikI%KE$AJ_ynf|*IiOlSeRvv7gxZnKev z)bcFCxMvBtVn&|jdu|&0_|2{q#Yb2?gfK}m1@AFeNhfxOr)53WJ28g37V#;r=XN8+ zbc+xdxQY>72Scz!%-8K2p}Fu?oK4cjZCzDdGVa%e(OPlI9b*a+#4EtTF52f2xjvEZ z!Ovb~FyzX@tzA}?3+;3e!_53WJ^wU~x$n5(nm>&ZGdOK)rHg($J8MJITwjMzbC1SI zKSz|0Vn&bC*xx7cWX`gbX{)D*3c>|{ipy5>ya)+D7f-v5A#Nu?z-}`n+K;GL6NGC? z;j6Sj7UQ#5U$6Y``)|9vZJT5^&U%MjW9f(Jt^GwAe%kkqmYYDlFB|ggxMYJY!k>;R zh_3b86WVzHQCfm}t(-7QWi{bO);cR!g2H+VN7yy^iui3dZEL2@w0Lg1&n@FLb#A3~ zW8p!7M-(7d%~|UpVM<~RD;L~vE4F{s+`!}{Wh04~d$lr&;}~mApLZL}Mb_d`#2-n= z^dtBL0qazUjX&nD-YfR?UG6PS8FpLStBC&sUKaa#5zHQ8hPf6`f{T8d&%Qa#+DI9x zRO2ojyH5ex$j7`k+I~16?oF03D?6N!Byye=trqjLHJmWQ7y4}RhM3W3q}`nR!C&Dc z1w=eiQVe(BW@a?SRVFJ7hS1R%9n3CzCXa}HN+o%4(+QKDwRY~U6N}wozAB^EHelDm zfM?vKGPuNJ9;wFIvT!iSjJpZ@fx zJRK=K!CI#nHOLP4-Kdnv{Tvc$F2hM}2zR2lQJlN~b!+&|tGWu+6ykxoUxyd0Pc$(7 zjHB~?on~@@?iNn*+mAo~9P^kt`qBTa}5rn>{=wtfaiSiP_*O-ZstGYE2MsgOM>wAg^Vb^2+o5OwkX`adw+FOZ-du9_wv%zJfT#+{B zCSW4~m(MvgG~;Gvuyh@Nw&LQ+MA%%CkaI|M43na{jF#Y_Yt1x3P-gLE>?0_Hj_+q) z&2tg{$+yn2)4e$@33w*dTK4RzQwEcsx&f$SKo6NUB)j1B1YQvnqC?98X!hgl1K;~> zz}XN-8|Y>uD7(4+%q*M(BIw)_=jmbG5iC2FQSQ*RZjHb%N%t0Vn!a*bM4XOgK|H+0 zpG9$xh%$|u2k>)olq=7Yg=e)~gRx^S2>{lJett8zo`HoE^_3}rLnt&o}f>n@jq7}b;91dnR{rsh%nPCvw*n5pIB6I?Bc;y&h> zM2Y|_0ogsA*r+Dpgx*0rORs<22^&hB1Hp6gjb=RGU|clwthulSlR~%L`(kI)`6s-U;?6q47+Ah*F^{Y0 zQsF)U_b5R#jTNG$i-e>Wf0*2hr%zU1mh2)H?-`o+OP1J4$$C+iG{&u|^+ke-8*$1Q zqD#Get)srjhbb<0i6J!H6GOy5MkvRJWE<-O<$Lt+{UJLOQ^u=U)k=N*<~!G4*NB0T zm+4NRP7{#Uq7U(w5@8ybh7sSENTn&n@Fno;8OGuoaY2V=(<+WjK#(Y51m2OYTqUHU3d#S*-o-d;H9} zE)(PgEf@OEPIS-HlrMgGW#h$5;ehKLl%6Rk2&d2swWz1hz1*+Iciz5X zqhPWid+u=45yA;myr!3HHfU9oDA2tCEpFK>U_q9qjok1c_x1a3X1nIn{O^vrrb)Pr z#&BO|h3qzM9Dm!9qBL1!xd)QcOi6S7ZE``nriotS?)w=@w+J! zr_tE+?Yuqw9HG|AVF&<091z)}vnps9vYTR^)%rn{kfh%T!^;*{2cE663kCSMxRZ;o z(SRh15M3IzDGK&>rULnB1b~rx$tCg=`K3j_Hv(&8>*zfI@4D%sjSB&ktn9aqf&yyhXD7V&n znSUQ+te=WGuEmf~s@J>xte>lTz_KoT_J^a7(+UjHEHRx0w!_|2swfw_rQ8&g(1m7` zLQw|ZZNl^-f$||{wcFm0Vdpf2-fAwJ5p`foaB!ss@sygkVb;^;p`WT)nfU2`i1xmC z)IoKg2W5$_2LGcheBEjumzAh*?7PY+rp_tL0TceNQjgDsa5Yk&PTR1!rsaD(F|XDI zUY=%A-in)|r|z$6pSZW?SbuIMJl&W&lCE@dglxwh38vH&Jg zA)FaT5cH$uA?Dfqx@T!V;XhsjjBGo+p7NRiv6<&YLKejqBUnwl_ssnF8L!dZ-ogmu za)Zw+?LxxhdRDT{<7i_wr2suqdUm?EWFlS%G|nnM>K>RR=HkU-BJ2npW8r-;Zl53C z@enjch_b*iRj=i<;`%=g(;cr#*Akknr3WT0)_75D_uYs0E6-B=p1vs5QO)tEV0IlY zN)%(g{_y=bl{X!({QUFJ<6St*YvDQQaK8*%)~L;WC&@23pQz`o5yVC`xs{?~jJhS6 zpE-FM!<0I-PR6&HM}yVPGaaO|mR3>JDKo09`vz<^>cqt-no-^3o~FfMTMa-P=> zS3AYJa|t2$WP}h z2mk%zTJPM4_4EF42n$^ohi8Fp#N(2E!87mS2&Ql%9w|;uVL^{BU6N_yAt_+PyN#zI z68tl?6zww7<{tOCUYA+)?+8BcU*^^`?&IqYNc!=P=lb+0oZJ%GrumHU0-({ z;h7sQ%R`LJ=A1H;B(--lo>3W zZd^ejiLNA9A#EU--h|TYZxc3ziE9Wy?SIy?hA^w^7+RMlptAZTM>NNq(tvI6sg4^^XAr)Tm)CJAvD(7s%Jwwegg7CHFZB#y0KPS2W#Li;e1~) z_`#!kGSZU4HR8C-#TGf2eVVJPGcROa#vIfYB4q8>LfdiUJt7z?3uu9I6=vb>r2x^$ zQW_-uw6V?zm+yY}{mRQW0+vvr4=Q|f&s{F^h~WC7LU-}4U`WHZaj~7s?-FV$d@H~F zOC=<&!G2>WsDA$RzLJo#F`L6iuFG{qAHIPvZ-J$NFPjN{N(p==P;6W~JAccD?Ac;p z`!!hB4Te=Op#*^{h(77u>vpI3oTBjcMG8Z^%FD97D;@{W&Pv}tPWgHHwfJBevsq&A zKfYc0HkhCULRy_!VY39p*2?pU@vykyeSiPqwAiQA_{&NXK3&!SvqYh+rH`kzbgMSZ zwlv!@%dh(W>#vGO##m{|6wkE;;cbE>ER7yU7arF;1y4sK77@HZPAFnLOFH<2FbtSq zG+WGUBP;zX*RyTHW{=Nk4fDi|ZgW9}By|aDcavyr8Uhsia!A0DK`q9Ij_poz-Wsq> z;5V;>Mg+U9*>={^K}lMB+pSgOWod5p&K-T(oLFuV>Ad`Xm4NeNk-P?Mwqx(?I6LlT$A!w!wRj_bOd@^1N6W>Fz2dX{jvw=Q4Jv` zk0M$kq#W)sxC)NBI?ZbmV+t!6chFyX|0Xr8tZD0H9T_4ILd|D$y-iVu8(v@%2@L!x z>h5ozEYp5&O?l}S%Xaam%wRFpxWOXO+!vf@_mptW;k&;++}rEd`w6oCW~{9xe#~3r zTIV^?D#6KR%H;@8G@!RFl5mWMBKXpMd^NE>_nK~AgRcZlC}N=)Ki!|FL&VDH`q&?2 zN}uL&ou^DA{uG7%@9hW&(i7Z-9BKUi z@>4P+0&KMexs?DY)esNDF-tCL5D|S-QoL?w?P~&R$}zGS3VK^u+dK)pi+9*mR*G@| zuY5?`J4={xRjsG7PMf%ZY1j7s5d7+{5{3|lMh%W6zS(?daD(1|> z6d%h>NVCuEu7+qk;#rL-*0WaP^yA`CgE_)EEt3|^@v8UUS@*HEQg|`XxNiK|6)G>0FVb&vmfYcY%7WR6CG!^AWxW#fp?P93)VlwjOs06&-N??%)5-%5VP73;5c6 zG)m5Wn3EY3yFP2r#^$Lr$3|}4`vm>PNz5>p?Z@1(|K-2_Smy2V%BzwSURHR0mId~6 zoB96p>!X!l>a23zoM$u6#shH?HVNw8*qVNc63y_G7dOwbv^jR}QmGw|b72SF#O1XRT@?5fns@=BPk3$hpx>WG zOYc{H|Br_&zy1Bom}gq5?US~2vFTOc%1Noe`7|-fyXq6KYYOo3bbaMN|9G33 zVy30{Hy3zKctwWMPl^%uZ8QT`*9lE=GI4geq_65hmfN#jbemZ#ch#BdGIX7GaTQ(Y zNOV%XRcE1%tl5o{Va^hoyb0?0Ry*e)+TBgL3q;*BYbgfuF}JN<*$+#ad6AHZL+7pW zr|L;}67KeUoJ5dTjpjX>ohiUq!IzRm*l_b>xccWlF3|;({ZMih_dHsYw4}!HQTVIr z#M9RJP09%-3}0`f6Ff)U>2V6&d9mn?V%P7=NS?S|7SrujE!+xeJc&MTQrwPG@Ls=u zJMfx%wrKxV+jSk)%zzmqp30kZRMQANhXswt682)G*R>QA22eI5mq3;-SMY4@7C*X5 zLEE#9R-Obg?w6H&*lgRjWYb_hg~@es;ISkL4cl5>rm*rRrRk=`6i4j&Vsd)9>PxJ@ zZwnmk2_Ov!D)|Xc6h-YFxp3{r+9bl+R=%+kWDiB?xGn)3qR;muFTw$Mgg>Wx$17Uj zGRP+!(-50>zk#pc8yXno`O+mv^971FZ&;5Tp>DnOc9uAES3U5}YOdwF81tqG!*sV~ z58>0gq_o@xN9!ZLcpE$?UnIDtIrgyTyqS`p^1mMc7zL$gU6+|U9D&g7jtnt8z6<)C z#U6i90ik~V=Bj$fo8(EJG?M|3i`u;_-`fb15H zAuF%jaCs1v21@H0O(bHRX3=SK8*Q>nGms60d1pTKf0j$Y7RVKoXtqOG=7E8FZ$QH= zXj^;C)uS@?Vx*5kG@GG9?u{55K+*E1Hld%feBLKaAJ53N=Cw$+faXxyKn=j!ld+Mx0R+*lA#V~0dj&sNLvgVXA+;PAk4Dap8(9sbK$a{^q-t?|%D30W$ckhd|W);Wr+c)tFt zsU$Djl(@y8F=}QCODKQOv!36zMiduK%GKgcl2Ng38S<@3jJ4~r@99#-2|vjy(w)yDh%H{VVv%<5`PzRt-gK&3Q532kVN(!%DDw1V#E$ZhIu?B^j$; z=Zzsej+P{;>_zh|1lv0~xDE&B`rUbG4F`e;-+uG`)B!HmQ(mgNO?Vyyqp8fADjMgG z1P6&fUsW1`rtup!sNBBet_%)%16wT?e0}s#Dk!dFyo5J&W&PCU|#@z7| zAridK;TmI+Ff)QDMSs3;++$rg&(Fm!32%v0YO=Y&-@QvXhlAX#U{1`0mf=&DSixzg*`x=Y0`5BRtSE zc_5}Z_xo~=bB&SWIC&ebF>hF^YwMO9S2idOw(CNiPF{E=c_8*oVW<4^@J%~H@XRw4 z0w%k22ZzZ*2k0~{Zl3*@VtKMcoN&SRbpoaH2*@cL>XB25WsqorBI3COZr5@oZRz_;J1hhjrdC!YAAqm- z%w{+MQ-&d>nahD|EgnDj6f4=Sn0>B~z@;g#Vh$~kPBosd28qkpLMR?*F^o{Q|5kIQ zX}h2J8I2JlswGrsBdDzq_(PeU>Sd*Z#u}D zIJ$WqVskqccW8`=RFct654&mmlf%6<+?e}z1ih7I5^qkk%$n`o)tJv($e?Z!@zKZ* z+X-A!i3Y~DDth_+Wjn54ul(u5k7>ziXCZ-XT(&F3N^c_r=NnsuMu zl!e&tWOQ;Vqs1WJ_D)%F!R__syWm)ytArdeUH@@qZRZWy9JuGk9_Er4g!{L(itH-= z&<``_-u=&0B$PksJE}?jb@8gR7=ilLE*&`TX7RC7-nX~nvzK?pTAz=gy)6bj8QBRN zcoxwlP+GsHuT|W+#4NGG-nIF%VY98qhA6041I^r zJY%su7a=sIT)~5I!RQD(%$eJlkP)i!9CWc)BYyApPIW)klIDVzaUU6<@K4!^XOA-7 zy(uOH-fsMe3)eMgc_1js?&mk>2C}){J$&bdS#Wh;9#PuyF!!s}DH{7+A{PO@){ZlJ z1mj&3f9#&_L2+41(-izi-+Au1CV9XfmHcHq*GF|`3U4-3Vq7y1fFK<{`|qz0-#_5b z!*6q~vzvq8!jgFFU#`_%$Q=FF|I6IEcv%;Ui_lRx6C&n+3dj3g$;0b^K;>*!k=7?YVmf3a3Jxh3Zf6pWx z)_MP;QC65a=)AOmD`EH$WFKMIwW^qkg9sIiHiO%lP9 z%|=V7rHCDIph#-8NC9|Lz z=F7TRS|`~XklUNa`tzG#Dw6-M!qX5Y*Jn<%dc8Kr)^4)_+;xqH?U*wLdfl8of4`)Z zkFDEriA3N0@WaY)|Kaz!_!9OZeozl?m&N{iMpoWgiU2o-4VgD`h1senuTugtVb_?C zYmv5XTcj+CyLzi~VV{*vYi~^MQ8@5xBDHqEJ~Ui6zWoZ-RSa`s)hpX^dQ0+uT$MIdySx-A;n^?iRbt3Z zYj_(hG)tzfi06$_J^{tUeYB&K z;j1ynTDveWf~s|j>7yyUh43JZ#L>tGMvlW)UUxD0jl3f22Y>$M$G%0^1Rgk8FXg zPX@qtcsEKF#j2P546bK$);y$Bhd=V9@j|VxEzL7LcLZ8vF?NT~3vXD)HD7-D$8TLS zhik#xXMZoRXtK}n+cD(`;cO@~zk9|44>v)-@#cikSU2&G`xN;5HcX#i8xEz*F>6R@ zcFl66tob9izr?bUV30Bp;mB4Xj+7M!M4L6V2eEfebQJuHMD3$2B2poHL3&=?~^+%Y2q z1RN$k&2ku2hzhVQtVvByW4CjI1$fY)#1UOP+5l^?3$%FxJj_GZ=agXpG+;S8hkG_& z*jN`P@&KTR#e!hwc$^kyypn~98iv>ZswcTY35cv9D8nIamnI7l$jcx{ujALHDOL2&_{o_#DKCMH+n%XZYuQaRNz zrE4%U;{j7H-IEBOWyrEd7|7avpH(_>mw>x2uH|{wRSn@7gMr%?oL*Ob@|K5q)clzu8X=W}p)+4^mC z4r}gdiA(3NCG7;O5{0HYLvT{Fs`0^DbFsbAX#{q08WU=4yM+lhvqaS$>KVIHQpQFu z#LJ}MaRu2s?c%ZZSRzW`%L5`?Srh1IY4E@Q%@5%UrB6m)9*B~MlISz9yQ~xmKi4rl zn>8=popR;&+|OmPp7C73`3E@kzR=jOzL-Co0QwoiXW^yPrF3Dm=RJ3Gy*N%*9DJg| zPsbWS3PI5NUP{q+^eKU!C3KMmxSki|P6Gjgy76=JuxjxE$!cO;6cp}gYwu+{DbKu2 zpo(p6Y`mIhvg&pwGn3WRW8r4!VM>I9dR&U|)As#@$DdPFBm|l3QMhQ#`}<2fHRt;t zE_;UKabAY=;-3Ve?9Jg{%@2JMwj-Fb1@QvPzH#C)T=_yJC&7PU*O*u$vwK9aG1f=X zVq77GCl_Tx@IlycmlB4?1GX~6b;079!Pl-cASg2@XsYX3dd9(}NO-uOF!bDMI~iY* zN$%PSGlf6?1`igmaW}jXn&7ADI^JVWbSn3m0rxcU@!5ZaFa7jz`2OK{?_Sv3C>AZq z@?94U&xS9(8i#k|c{nHv5BCY7Tg&h%%TUkjHO=G0HStA)?mh+0F;}z72B8Vz<aFV7&@FY**wwxB@UelX2yijVPR=XQ@ zPU8#*DuGHX>q3iQakoNzrZ7gQaNG@uXSr^Wu1n@&la1M;Y{vK%kBOm9iUDyj@y|5a-@9s zrGdqG?{g6-g_!*U1FFOLF~_L^?0%oKCN(c+9o|HES_*MF$dFyKW3!f8ut3=N+)2x` zX}OBOwMPqXxg@SjB4GWAd6lN0OV*YzcX$5onIXt}-=CFU|CwM@Hj>rHs(aSfKl)PY zz4}RfspoI1Z(7R<*x!WnAY^NE-5PKUO4$}Pw_hI@@+G2eJa*044CX9ER_^KLaSBZq zTLiY zPoF-oA@}cEgYcqp$-o4AmK2NdDkj7_Zk1=9W>=7`Q1QuM-kz@fKmYQ6<*Qn_y^PWQ zRAIFJ`OacezhpIW?TJ&u4QuxBvWCAtR)fz@IJX;qZTAjYG$P+G`QxBxon*Q1XO(`+ znvaDf^cIc%V*>3srg9k0Y_ta2&D}M3`yIY0u6LetvKkHu7p$icttPB?5^AftwOPdi z{$J-cz~l~slO4N1bx(MDkWjOO$z&J@d!2ct>MO8+mw==TJ#B}IAAWd|g%%^5(wkEC z6UMh`(W!>BezNMWvLvs?^TL_;AKSIyeY>>RHAoNOi`=@~Uxeo{i2(E0?>e{;PF$`V zS--Zw;%ekAISprb5@wQTz*ia3R`@SAIE@0D<9-Tap5x9Hr%X6m%Ww=%uEpe7flK_d z`G$A!m#k!oWJ-we5zHQ=#xz;jGDJ17XCXGtzF$gu_RF+&?xzx1Se}FmSF0>f zR-^WRgusLyx))2x*a;p2V0L)vd7iTfrM*d>W5uxoJ`+KcvgI)M#b2biJ&Ut6?^1eJUX*g@#>QlMu#Md8% zKj)Qd7`vCcX2Nc%>%(U=ESeLZM{%{6DcG22?0M*Rw`39?3O$$|1ncAy#LKu+&s#&| z>7PI2hR^={_1NZ|zH^WV4+q%zOu1i-j^)}2voD>DHpAF>KG-?PoiQZF<=FSrg01Hf zRCsmw;?e2M~GnqZg}VA{Ql*gN+9)~Fx0ra<6$myX#;+sgUNB} zM(#_*j!^vbJUcJ?oRFaVVdQh~l&v-(s7{zxmwE z8nP2a7h+Cnp9V&*ribhHfltS6MA3MtrQ`TyVx>9Z0?S7LoF&JswoXLSbx9&|>D;2Nr?z%Ii*TgKJS$m3mdW}3 zr!3K|#u8Yj{H5R$l$>cT?mpJ4>%q9aAJ*+!X)1O}Syw zDC*wgR&V{5Lfrbvemq)v{Y#skUR0m=IH6uV^hFleFV*sW&gwtOx|Td+jA~E+`glNm z-`}(T#0P^Ng<`Gs(ECvQHOLJPMVsSFI&aNBG=DBm%?=3X^WalCX39y$^5@00QXsa1 zzYN`-6hKOC8bw>>lo*mb_wsaMOm;`myO1BIxbpLuuyTb)Ip9gWqqv#xvY|T%+NNW(fEzYj(Oa zg(C!3sL_1m4y-9qGC{8n;~0MaWlX*OcMs?F{|E^DnNaMXK-Qx7|HEbO4Ym)*oY#kk z`L3Z~!mn%ZQW*1r$9uU>2}JklIo%BYOSZ$h`54@PM2_FP-u>oF?>t;4S=dN&n*lB3 zF)#wNPxD3JrwICcGE5mLI3YA6`1-?>oIi;<@vl~C&evWu`Bp|_3+SD8c$>*6u|%<@ z0!!|i@Oc(SxdYdvi6Ah7z=3epplODD6QjMG0TD=@lR(niY1(Rq9MaasJ{$-`FTVj) zz~axPVQTyDaGoF&3xOCrrJ-|c_|nvDrpiLGA?$sHnUh7-wc}cBc#BJ@DM!51 zdaMkutE{y!B#;Q+C#)i3Yk!ka{E#a~iz-Yl*_fND`?nZ0kZxNHD1n+1ps4h&xgoB- zHvD{AqRL)G^1hhKNgAe(9^v{R(~~TZ^{nQPZDzYFktPQII9~81BD8qNJ@2F1rN;8O zqii&wQ3e(5n~O;pp##D-qOyq<^A^6v%{6I zaw(q0P{p3MZr;|Lw2aA}7QabvQ!3KVS$FHfUb_25aVmjs{VQ#4b&`-fFInk_fA@Fw zo~+Z#PDmcZCOOWEBc6VKA0%ZvCPX)%jFM#M3+=5igee*?rG2$6m!_xX+YhDtAFOPB z{bc3n{_V=myI`J>dA#4}T*kjXhOmG2#bI-NkxMuhT?6LUxnlm4`oV4#e>^C2^q1U? zr@3U;vkq-u`-cy2W<6JX-g+LEPq}Abh3}jDn=2n;q({BBi?K?cIuyI@S?6_PNussJ zG5$1pRJ_)26sGGEQ6x5HfR-6q?PS*5QOOI+dR}B*eEWUwy%LDj1g`FgHRff=YJKum zO!p;Wzif-Nmf&9xzm=v;LRxe&LNG>$9w=~ES=k5}H;g z@grrWpIC*IOs*pd1sYP@Q;-G1Z5sCvp9zQBb7x#lca?!({CW8K-#O3M7hXI8thDpPPR#lmNTmoPNmH^tL!q`O)N zCs~@0a&a%4*s`!S=H4up*v8CVr+K@H7%h2mTQc0h^0 ziDk{AGLqc9CDIUbtXc5nTJCM;XAb8! ztp8ufU!UulJ$Rn&Z~yu1a4vysybixFmgMqIsBh(YP+N>)t|m`X!MczPsq`wrMVM*5 z_C<7bkA;tgeuJ;deMZ39pN`itEF=scvQZgIoiM+-LYT*S^IiYi&EmfCv0jaO#yI04 z6uWn{5rOo3cpvOoh6Lhtw>hXSlxD|afANm?YrB4zAgov_ci&CL-GrH*l($(_XAShC zMFkYBR+7nG%;YRL4(rN1xRLbHd>%8g!KxNppRWT%?xwpI)#j;pSx0--pFOKlvUm!A z{|MxW=Hw?Vlbf*~a8(nYUTkKOeoHYc>+FYc(!@9OFL>sc8;p?-L5eBq>a^j^>#1HuzVDE z|5ObZE9I+axpY!?&azB41Nv=3^nd@yf4}m-{=?r!2sK--v4CvhLG0io>FKV0?4DPI zf7$sI1Zha`>!J85%jzw{Z>_%TImbglDH<)$&k5*%%3WH1$)wwFRiCuYDv69O(TBk>X}C z&Wk$fi&cM4!PyAEHtQpMxX*h~*+tCtI*oj*ohWW5si?A>gyHjpgi?6%Qx@A#;(xi> zk8)i;N!U_~UK~^`9`m}2nf+2-({WvYUR`glyePBveO6s|bGUZ1@<0FX#mfFgN?=)) z+}jv456woImay|y$D!)YZckX)ey(2R!$}^I`&@^OZ!=hbs>L2Auq3H1L_Y|g zrOe%SL)bM=v1)tgJ#XK>E48`Zb2}V5z5jX2Z=O`{pvk+eY>J!v=>vS3)%~F|8QXqw zN#D1BmD*D5M!n*@`!?Ec9C7y)g2&Tss+ay<0S!Q<#V`BsOf{e&NCAcD`$EC{{8eOMH2)i9zjtZ z<+;zd;XP%OU`odfZ`#wd7&C=-wuIBkDY|+Z4hfN5RTug8O+1O`rJ< z*7^^R^)AVy|I|@3KCV*e86~?Zc3gf!SYq0{@!+-G_vOzeK&$clVk9VQTQZ=dZAx^o z!_GA>8R3=Ur7~FCya}&>rsRu&r6iCa?&o|SxwYz4c^DkB zf3#u6V?_t zEo*MdFM8I40KKjbJ`<#C;|;y5vvm)1^*U_}wf^ew#%++@hQX}M4GZxvaBzix{(x3?_mZ7fZKC9M>6moQ+u30AHoZa_&myJaRIO@UnTMF5~N zHM-IG1n2KN*Dlsl#x1;>B{3qIf&?X3gX<8mW1ihJxLYB^LTCX!LYyu+F(?a0oiSgg zH$plHb`bG%aiR0i7;vP?VhC2YS3;oNzxNT)^k|H6R&rJXM#x?%1)#2HDMq)k@EB5n z@6CuO#srLC?P_fiNwy9&g3UVZcJSdQ17BdhOm!FQc;xKFklr;>%s;xE@R z-kg>x7K^~j;S@8kZ)sgHPRn}zrLBR)cyfrw5M@LrP_ld|I#)3&Ze~`zn!>;R`+vw% z%>@?HfS2w&x4C)*qwV~Gz92N0k{*}Vinrj$e|f#~%OCz!(R+=lvpQO==Dbz$^u@{_ z-hQkFn}XYjBH?-xsrd5ffuEOO7}$p7f3apvKY87b$Qr zbH!@0cAS7dN>f!=B%Zq!B|K@v+ILz0Ycct?7|t9mE4WLK|B%ML!+q6yQRH?T$K#6W z&6n%>FsAUSIo(C4nG{7`%l#un}#z002M$NklrfY*~;%@0O+h4wPq=RQJL-3X7`q8%f`5rPa6Mb z?+$;9jml6~s-a(Qc3Zeu{pmQR zDqQ#>Tz*+=zoQafcz9S|; z!3sOe5`B`QHybafD4bMN$~r~wT&}X@bx2YCy|_kGhP#f}MPmc^93I&{$D)BdJ>xn7 z%-Xmq27VYV;-C7|P9M$YEcU8A=CbD;K7TgjWcg27(%iG>626UpJ9=cbNIC;|{L3@^ zZJg$h-zixe-e#@iHQ-?Dwfo9vI{nWFocQ%?iJ@83W$f<#>(@gbhVTCR7(9y>AAWln zpKNV^6A9|mAD%ZE$MLmTX1p-?Wl&v5>wcfiPU0$oH-ZoEP4a3|5^{DgLJCvq0}sZG zv$?L;oWXaUGz}+4QlVuNN&x1LoBQ_-{IgG}wX)$gMPLlWKf}a>+}b~hSlMP=VgL=m zTTMpcI*Ghp{hY?D2%3ML77{JQK>IER3YiJHu5OWX>t!Jw#(*u7z_E-(0~jRgdDkTX za4*v2Mk@&s>~(h$AwXI?%pa%0Zl*O8JhQz~$ca(e&Pi6Jf@iU)DErO)HvPmmg)dbV`7VXT+AXs)^@ zeQD)sf&Gm-DO}|y%L`atp&GeT&|@yQeW$>m_IBAEE)tv)P=3y8v75%%n2fF)X(ML| zP;t~Wg2q#~kLL39_R-3l1jkita+Mpjy%%yB<`%2=aA&=iZ{QfLWKI6Aa*W^o?f)>= z`(1=;&9$DpDdr|INUI|RvYsokRTzBvRJp{*w{?{H!_T!lJD+&kqpacW?)N@{@=tY} z`D43Ql*2O&2Lr%_Gu*}svi6jdmN2W|eu8@|fA{L;O7_LdTAfZdvtVAOkq6wg(N8%x zvI;_e?dCqDoqkNH>2`FG^)GgqVC7=gVBt35T78?)NWVWi{6` zH5{-W3$-VZn(t)D^&E=KG=9#7f0l>gQ!vvlMQlzQINXa0hR}zC2am(%2zy~p@LD|W za^-n$IAfK~cNMeWCfLIXZt?Y=Z#vxRvSrWUbmI_*hKqU&PaDS0rHDGv2TMU#H_k@D zUSsA%6S>wW5hP#-&x7Jx@6T#H-@Oh>5E{nR{bho3U(>bmgX?gd0G(Ix+sLYt&3h)! z-I(wLF3jg8Bk4}^u{ic|`1UX!c>my<9Qy4V_a!_Z1czEju(5e>ddLWjr@7c!F08E& zAGm23FV2)_#P@DeKn@%C;}lo1|5J@VqM0q*fhBPEf`j+jLaAgx%Ck*>$JHIa&VHwj zjj&@;?l=Cm;CRxSa+fN%&|OC;X*XOO!y;Zgyak-Ydoeq!i3j6Fn6;Sr#NoQP`BE6U zyzQ^)FlU0>eEWai=ZF5W1`jVv{Bq7B1U=W`yJf8wd?G-6x8T~GGQTg^I)}T{SmU+f znfNrpCK;6cIzJO>^wmcGrvikVXk#<+D7kUu>ESh{u_bVc-=bsBOK*> z%vifG{EPW?RXj%-T7RvEM-JgK&tcTLw{5lpVB;XH8z35Q{FIp6p5qxCOZESvflFSH zt#p%Vd&R_MLN@_Ko7iY^)ZCPrMHu$*3F0P*!~wSwoa)(b`z+@6Iff)TLV3aCkbVG^ z`+~;Da&v4ppswz7=6DkQA~RZBqMh6T>j7=HM{2UyY2q~KJuw9fKnMqT2me3IPawHr zP71tQAk2$pIx)xycs3*rk*pJ7j$jWcfZ!NrV?7dpn6mhZWEL@(odh4iUKDS_^f1ra z`bHqTOFDC46#5Jy8`&NBu}DJN)}>ctZan)D)_HCw<1TPD@1J#&h%wm$NW7FwW36XG zIOpwFB>bd!+S@EpjO)kxD}K(Z8%;Q7DW)ZU&~is0QuWi`b16P9q2r{UpW0__maxL9 z^ry-sNT5&cY@tW%?8Vl)T$MO+Q(R54H(`$;Kcu95PT2i@{WKrHs)u7*??plJo7RJy zW-VALI;Q{_3-^;+#MOlAn_u3~t`x_`(_Z8be_TS)Uh4wE-=5s9yl&6J55}H5mQZ0q zYgUed#4Z{^>X!9P5afiKq?K>8#P4eLR`aWA61|g2y-~}j&-MR&f3#Q&*LeWmr^wVW zYvozE{JgldR$>>q7p-5A35RRnb(pKEaldaT32^37U`ah|u})h%7I0M2d~@r?>^@9q znv$gK@-ChngL}+#&>C;IR!TMOW`CCU%hF=WCtb5r)>eM=P1%aNu(Xz`Ninuuls%7Y z5X!7_N%kCg8N19YQoFNCP~POGK1sM?ewY&)c3>9$JFj63zxpg$YKhrEzpRUtNLI8R zNw#x~zYoq0JEl{tS|Ur&+_DF0>oPlHgnv5TIAkMx)>Vu|om`6)sx8(qr8Kmfb(fty zojtnd`fVFb#|O|XMt{&69UW(Nzx$BuFDpANCA4;;BWsL-pTe2uAIZ)0juSxQaIa5`M-wG~M_JD*ZdX<6B~TVzIyd{+nF2wqxtu_!C#{c>;>p zNkah5G%ll2iZs{clt_dJgfe9a!^d_4i7)dZi~LH!Im7Qr;?Bkb9Rw|Q z&QJ@vI&GMH>!|N69v=3^i|_FH;5~JQlOEp}YgtW5akmUQer^db^V>|!T9a#>8wDq&CjeZ3a6# zPV^j>U}%-*UOXq_W|i1_g&rdY7MQ1t%Z9qheiM}E`oPp^pcdj&M12s4SWf|fSjN|* zI)Yzgj7ufZYhjj^!d;ZqpZK5>3|gMu1@=o)N_U7sW-*o=VD4I82|mAV6WX)fOW?Sd z2CnW&Kv}m68^9jDeYwuOSe zjaOrY)8d8ivQkfa7rV5Pu!iCH?OVAtE?)#j)1Hh+n{J-QoM@II!@$n=Uw09>`8?l` z(X?u>l^2v0B(`>19PcLFdfadCVtU-BUxmLf)BfS% z(+F6B_mh+oIC5D0@zpoantx0;L3mPte^aI~?}xbt`&?!rN=@OL}sBxX7tty>h zSxTxKh8Qg??NExb`-OQ^s;8JaoK~i=Rty%-6GFSi+Sb}nlZQe9J6ELpaIbDe&jjzM zJP-<^#e)3i<$5)k){elI40C;YU(BzD@ChUW1fzui!-pFGg8*0<^&(^l3dguoTMN5s zaGi=HZkOP3m9l{$?etw&jKBh4%dwThEq3>@XYZF${QSj>*+T2xQM;0K%|xqtg^;4+_Mke%@?27+5r{|84 z>=dHhINF}CL0b$&*$pP%&~FOEA&QKyrL7J5n*hp!S&NzPq;=cr7{XH;OFo;Jf+r&| zZWoQL$!+eYwNjV4B&Y7M_ZtkUmw`JVjy|U{8WGQFLTQ9i0&APFFxY@Q8l*W!(7=F* zXsBv=bcxxB0Wv=U+xQ5$OEpD+lBRc;&l((E4RD0XTF)G$3Q1`0v>o?y;(BxC%9<-W zAMxqkNi#kzHYOp%Yb|R-xAyg1a)jeruAj>mZel*og;hY~+}ah75XUK|RramSP`yPp z^QBPyT&Crt_G~+h87p+(Dk0^%XDYr%B!~4KmF|sDAs%bTwm02=toY+x)4Me!*Ob@> zr-8IYmb#$yqD4tgIBUN5jq@O)JuFcFECHftmK7c6bfVlKxa)_Hn%4xEM zTSME2!Nv8)wnqzyAi&#tAPD>CJ^CJPy={J{DGQt7KuY}_cG@5m zDP&4WHdCl}!-1VLS-BS9%A(HghNv+cjVPXH9o**1{o$MEWs=Goj$jEA2?dR7_H#=> zX()V|5_KD04NQuwvJ5}uQX~*B5L4JXmf>?Wmmt*lD(TimHxa&F!+ zv=eMFV@&;X3ez4Xq(dB3*5+4V6=#h9KdRJYqxCroSI~T-BUq>(Yx7%mmjwvU36Ah| zo)v9)4hHOemfFyK_~A3bNtk%H&(7stL8m^ysNd*Lyv*N@!@3E5s44tK{eO*>$Lpqs z0=!#dSCk1&M((-?CMlNgUe4wD2(m+~nq{1eb5e3rR+sKHDRgBKpN0Pt4Jo82tKtC;9wPRxz&G;7X|Brh{W4+z6g{Vif!3`Uhc&U-o}W{M0~_ zbJ220R}xlRWz`|)F3a$i_1#@Uran7K0!?rI#{kg^(ZO5O#q->TnwO)0`u{4=jAKrV zXRsgf4F9=H0-(3}T<~Aqr~U0b*UuR#Vcn3CHrb@DON-Mltv!=^0m2eTO9f6VYvD>X z;gg*@lTO8KDVMZZ^*1+LSy0_@FW1mz1g1j=p>SR-z}7(1_pkvD(&UySa144U_e^@z8Xr>+~gmN22+_bl| zvhXfq6q1a@mX@v~!J`C>l|~(IuHxm7FSK{=IscUm?>Ah`y3}2WetPzZA#NsFg~rZ zz};ibr`*?zw{s?(d>0oi)Tl`w{96Ug%CjS(BEI znC+K0U1!RwJPEHbB7%+U6K*d|sZ-G==Hs8v@!z~RXZ4~DXc*<-u()-Ksm!^J*1q(T zQK+uc=-2!0DwyhUbDUyDF!IbiSXU2%NTL;ZD)`2D;h^=xjL{!v@7zx*8+-8so8Iz7 zym0d%p)^S!*d=uwi~9#F+4;uKD#hDd##uK?hU{SD7W;fS zjFke=CF5~{gS(Yf`Chv_?|6oHFKf$9e4TPhDYy(jJ@4T)H=0Mnl|^8}k>&SA7{WPl z`m+#(Ni#>*VnU;_vU+{zCFTeoiv`(~XS~ks%XnfK6)2Zyjq7t@oH3LDosK;5d(X7n zkn=IA@Wr&53WhR za4sfsgYoMI7(1i0ytqUSS^%D_=q`qK*S%>twpj|TT1XjNxmePqXyAxm(uvp|q?HID zyKf`pKt$^W`60?(^(#8v7@t@MY;!N0tM+LS4O2z1(-)Ms6~WQm?SJ?{M1F@@+@Cu! z=;N}(I-`XTnR||G%-P{S;yh6+?P6LJTAfJ==0l^^%4%YN+6I^%e}Q3LP#RAXhW1? zBv;GhNfDQ|8_Y`t4+M>EkE4ioOWL+;c3j{e;EScFy=zZ0}w1w(HEG zm#<>lA9ANwTz(mcdJ^;bzSQ_VZene?ioN6ki&>ZYU*;tu+OEb@d}MZ1Xbe{|t9QS= zTlwX+5}odqaJ!8OiZfqiG5o3fzqd(lLdkmSjIxz`@uqv*(Oq4o7|nI~B%ZlnImXj* zZ{>~*=WZg-(};7oYo*b%nm2QkUKYC%+uPiFIpf_O9@F?LanSK4Q54~ZFRkxsIH62v zEqJYF{gy&hiAKs1)M=5Wc#kLV04gX#|B-inJzu#mLNa8un z3d5Ao5^fCLXSVR+MhpJO#@+bgmB#DcCZSl|wR7Ps;+&@HS?1z)=#OCTY4O>Z2ZjyV z`etDm{>EQ1mE~QVG*?gzmqzeWSoa?Tv-w?iPfZcAgWWm>MM)>4W@EHM`VB3jTJWG-IrP@h+ zL1NHx?$SU}_#&&RHQCRi#MmF|1$kNEnOa)-gii4+W3b1e&krs}+z+V!Z7NkC$`x5@ejPq{ibV9?>sXXt;Osz z(RCl+znwAKxcG5nI!jPe(nb;P{V;d?@C5=iW^R4Pn*G9etP{AiB6m|lWrv!dkdV1? zu`az|b)jl5@U->y?lnnt!EU<1xI5wT<#_meaKuUlY~Q)R_lMZv7zx4Int}JP&v`g+ zzHi+fc-2E+Nb_GMTDR!w`!Dbii?OLtTlCP>&(s4iZZ*jSq(q_BeoLo?&5;}YT4xeVE9{ugQ1=UWNDn4H80E+dEu(aiC4E~yc?U9a}& zqHCYM_-cw)k8&ldH{1=eEYeOwoe)X?O3ubUV%9%jy%{T6y%1mdR#q5-l!Z6e%x3Y- z3MIsS?yEPuOE7P2Brp=(KY#vEETLz_>@|Ddh?%}>dzrO%SHB7tip1Za{{$q~mN zKdroN(IMzb2`Jwld{b>)F+NsrjAO5conX6D>ZWE2e{2gI{W!Oa6YhWeT@4>Y(BhZe zYA1L9r8R#)S!{Z@5*qh0IZdFIGyGWFwSW03w@_~MS23YC@86UKTc@0?qoWA^Lwovt zyscI(zPa6c8w0Cy5-@UCQI?LthLXlS;14oDKpcy3 z?2qV-$j`Jafv1m^drY(X>QL7cV&}Q2V&4h%6pqHY)4d+2*=z=D4Y{>de3X~x<|!RJ zMuFLecQy%@S-G2=`j=mRNk|{JHf0-!)A8tjmyub*9XJ*bgTqG&#cOoeT#r*$){FZ! z;M}0O%(Lq4mO_x6SDR`}rQK-fX>skl_|WUOf66-hoDwI0q4;$|mIvfKSlr(7Bqe}T zZtQ<(`zJ1641E&#@|oxOSou(kL&;DYTHsGC%IoOhZSm{#`*+14pX6yE+;8f{lyL2? z8qc%n?u)f@(Unx1&|3_G%V4n8UWz;6Qd}m*Pq|Z>q6uzESd4+&JZk${v9(A@;Yty2 z92X_&C{@x0D1P2~UB7X)^151S+KbkMJ9u7RH8h|p!D$3+vvHds>)YJdlf$spm^1|- ztkH~wIOR=*tc{=V<1=Ht#AOpP@zn%C_#fhq;F~;&kktJmrCv+?m7sG_R#|46n{eq5 zKTkGDR3R{wwh^FrB{`A}cHSU-MltNK2XBIm={1UC@RKntwlBWE5%0R)`liyaqqH;L zg%lzsDV|4wGiZ__=WT5^G}rfVTzF~5xRzVpP=gr^J|*DOdjE_o1<*b){LPSatzvd= zL+&(nWPq{OgSgoY08w&h?i|!#@GwEueJ*-P$+16K2?PV@=0~{?>}A z!8G6yr5J^FX}U}hX0poeHfaq^_Wo{RSr1|@4w;)0BJY9G^dxfazUO8wT) zG!%--R?J;d_GKWCqlJ7~QgygN$YAw%l~l-v%pd545w`KPIW{wUCb=ZSV7(vbhWhmG z{mSu&m_g5cy7y#duW|zSG0#w}tYX=-7{Q{ITEn45KlZ=xaSiw<_8|G=X-dsjuse@Y zB^O6Hu6LhQk--!AB8K}Zm?;%l&z*ePPh#L3)dI%v(x!{YW(}QXvDvhkwN4n=t5P=T zR>~NB&?fh)Y_$9qqiES5j>gPgCLYLTf7n{xBag?TRpl|oWzS2T5o21f8T+Gf0Fz=t^006cNyPeC=Iv3tdK{JEdZEOi`(gC47QhMD z7gyEt_k7it%RB0G>=t)J%hL9_(6&WCcAPqVIW&`()APYLI}zZ#Q8B5 zxdJU~I1UEUf7T-bCOJTXJ_~kSrDY7!*a;Q~#%VKJHLB==RdkR*a1SL8^Sl_CH5N}a zCl;PK+S}Kk+M}`t>IsDp@0U%w{m$}HGb~#jll|_y?^_dLmgDB|bk@jTq4)+N$g-Sk z!g1FV7}nSK*Uf(!UvBKI)+ZI@bA{q(#&jG0ZMDt{^o4!kI3A>&3$BSFN{o^)22LNc zJe5Z2MLWu7+1P3BPxhU@VUvF(R; zczPjU_IgrT6~U#E|KoUtezO}1Sg|r8o5`|lT&$)qa&FeeKZFWAnfEV08pp3+e?IxI z{&*0YBYe7cajUlG2~e;_z=5yteHUTG;}fy-EafCZ1Wq9Oz+trp8S5pBHPPU}OR&fx zN`paa0Fi_bx4LKi!Sk0SpA>Vy6NYoLbDcBXqw^UC#u9EDQ@_nF8Yx`Hs^9k9v$5FL z>n?>yt_K)wU}WRojJ?RD9d%8-&wOT#Q?w|R_!E!$x; zTzl$CCl~AZ6e7`RwqhD;k02QrpR{#Sd^2Hcfyrrm^3f7Jdw|$2S&v+sl0n3SxL6xZ zV*_|*{Sr7=RKHbMj9?uwX!B`}0UCk~8U)lybN#E6DH~&Dy+1xX%*2zO_B(9L>36bB|k>^DM@k844YGd7QO>Dn4 z2^O7y5(C)|b}wQEr$4_P3tC+1s<~^|rhn>Y-VDs*ETTok<555={jEh`STb(3`*3tM z#;uNSJ($57ZOAaYQN|Kj2Z!zR7$Z&!j$qLULB^myw3L9IM+ALLw0pexs=CM+yG}yd zQfcI_pDgOVDmHhWC92q4J?}}3{ik0()V1b%<@K8yF67}r-sp>Bg--4h!eHh2^41^o zahQd_WIm$|P1(`0d!Q3;{IkXf599cKCxJoirq6xi_FPX8#nwl;!|=z2)UOmpO|YCzgzj?>#xF#w<~YLH?7)iDR$L3#vPn+ zB48;!GRZ02dzC-f_Djn|xH8_B=+$rj{^9%It{gm0aroF;MWY0=-nU0(O^?MWc`cZ5 zvtrVO7h(A7)vJNsYTl#k@)M4;(pfXgA3hcGzzcR$)G=NB2~W^OW0>&ZW!xz(5!ZA7 z)4~`>#rN&(v60fNZ>Wux@2fMV+_OCJlbb9Nv_S}3>!sm%3QqTDGz8lICI~ggI4}9` zt9W1ZorSs{&ayhe-|jE?F525K<5i10Ard7#?+e>lLp+QnH7-aT-~V6cz>;G55!k+a zIDRb%|AJc&IM%rjC-y$~YMr^uM@b_TSblwus(N`gJKOc>pl8k)#+K{caIN(UGAT=` z<6YO}qvsU;GPJqPW6NDL7xnw{^uFp|U&fTMlQ~P)swMQyd4BK|tBl!YY@;Au;q0M6ef5LfzO;Xe#}Gh_^fry}IQR`?b1d2^Tj7}x4mA$kl5ZoSXKRIg}0CykL{ zc$GzyKDF}u-~T?V=2`d7Og#CRR$9??>#-ICAEF7VZCfOvi2pZu)^SMuJlO5KK*dWI=}D*J;d`%|n@wk_*;x+^u`k^2LT@zTp%clAX8Io2Hy~ zjvY!y8_xnrryXG;j38D^a}_Vuv1uzS%lbFW=~grQPmZ=*on;m@H^|1$b;?lPg?c`v zjv(Vbu#1L03ugzEgy=07SBm}Hl8kg_d7m=&uI@Y+;k$N#tHBsvz;BG~;do$NK)2xj z^2;<=k2xzRn0dCg!*ruT>m0`({02YePwEE)NB3wh(f+=ePk=p-Fx_|PJ=`EHa5kPI z40<8 z)92gV{eBbMR7Xo(kA)Wp9p-Mf<{$hd0aBRES@?r@j*EA$cW=f~Fd7BCYl;nL1p#QT zK{Z$6EFO;d3sA&AJ)}vtXz4r&$(U<`Y_z8)EdwkiWgZ|w2J=p79#?{PSQhIf*JHQn z-U}gJHW8Z5-aa6j{K9bf_YX=c+0P%|oni>A*6NmGA~cSZkgM?ZSTYd8SnZwxz%$*D zhNM3a0Z&6B*=r-%0Jj+4Fu<%f?V@z#SQ-fT`~ZP?&a%dWWzUW=V-T~_-E#n!1`<^T2z8i%+t0* z(y;dn*zXj7u&oi-ycTUzqPf-H7KgZ`;djndq+u5VML|1W&@^Dj(uWwM}e;1+j}6CFtH4&s4JTpS%ByufJRQkKcYfiB90Y6?~Pp zc(IUYbJ5n7d-%LDpOk>}=9f<^KmODWc?+4W5U{hJ&Ac)Cmms4<+_?$ z)iMUp(pWXN#$?x&)z2@7^@;s$=_(O2Etru6~O|e1yBcdxF7j9nV zG?HmLE&LS+EPN6?e){RB*00i=Z(dHhktC}Rxg-hJ=TDzChLnJ6W9_kNeT@B8)<3}| zL@_iK?u}q+Y}@e$ouwo$p&!f-UP!8YQe%hbQ_os5)n>)(;SLXudx4z<6_y$$Q)p=Z zHuaQmy*_PzOktlUB;B{6bzN%;xq=nTN^8c`6o0UOQZHcfzIX3hzs5x1YVUTQ0Mo>P zu+@} zA0_uFe|rcQEqF0#G2`}^8T}eZeCND}m(PCxLW(}lZwq!Uzxn-PO(yOJKbJFGig2O% z$_IgxU?;(*n>6o~ziWMgdl7gtJ@Y{njGNyRYr#D$xOrW3XU-9P=nG<-okz(+==QCp zn8ww;BAd3utQxby@S@L{AGJ!vG_(jx2a{)q+i(*+I${otUnmG|RCn+W$+lk`G54Bj7!a|ZH=t8nDK6wnHbVEiVjcivnZ}g>{5_E zZvJqFg{3uDdSd7&0SKYj2lUx~iCHN|(avfFd|Q1KCMo`eu`T=QMITw(V(IbpmG{As zi*aJ&2p+Q-YzaP%$uSIT{#uwDGI(He7%D4vquBCx>rKF1L|cTR-%z=Pu+tbUi&)%O z_NTw~Ze$g4$%6GwaMDt77+k`27-2%sy~aw6v0%zzDw&1SF&iC+=(-7=p^NbMKm6N& zGa-Qw_0c^KU*5cbSIqC*gwH{Bs6RK?r5pg~6F1kx7a!1t1|m}!!9c8CPC!47!ozyp zse=2e7H#{{$IBPb=lQ4Mv|NU96?Wz0+@?)_T&0vr?fE3s;4S8{A*(bVvl|a<Z`a*I8&4~VA`s6aUdouOLb!IQxo&fjNIjRN5KdTKQ+U1nE|Jb56!V~fxI6f4OcUU=yY(~+u0t7_V+n_(J8c+$Py9I!oPj2A88CH7pG(fy*ckfnpSgMrH|{q zcNVefgh6|}x>4fMbF)(I^e$oPtml1-aCGpwO2ZbnJIt!t>K!%8eTFE*1_n>>wF~?|c{jNK$!O0lX~Ai-<@d z;XW6UG;K;2fh8_LC`yJpOKW7cO3Kn3W-r9F)z(#($Z3CzpRsQ5`fg`GC8FyaWyILb z8sB-sh^4mGdabK3Yi@H*@k8HRPf1ud-8~iSV7)fS&EmylA%#DCW#`KHJ&8#vop{!k zP5Xyj=+RbtJc@GDI~r+(83>HTbXQkZ%7_fD`G4!A_tXrAI8~k=?taAHYcH*~ zx>*9q-hC8Wr5HQCwBy@}*>bTtSUg?OwbrM-AQK+z!CMw}k8eHd$C)saDXL7txwDlM zS7Yb@tegRy!%J~*iZmCW80n`^ACOYxjh|=$@gnP~v55IP2xpd*Ytfz;fk6NtoSX5w3z#wh3Eu`->gYXgBe_CUk3HnE#C3+~>dE<)S$7l}VrpoFPQR6wffZPB32w1nMz8Xu0S}f66q((Uw|@ z`8|w=sN>EI;Ws0g;?wyF8$`%Kz=`2(#*F#mxe}x;%V49K0*Z_@yIrU?G(qij2nhc4 z+YtFOU%L{J?fWG|ku}JjqqUP7oC)T4Pnw9jAXe*b79PP0Y3%wfN#G%dy`M%5;e*{+ zU-k;Tai7jTY{!AA`-(}hqs8-Xa$5nQYm_SJc`DWWCRh<*I_fJsVcGcnSV8(t<6y;3 zJ){K=9Dc`K6^YWmx7)i=lWh#Zy^r)x%#~o{*^P+!G2wHOcKFAii$$hTJeH#U-F^uP zJH;HE3+8VfEcjt@Kv{C7^NeefAbgSrd{_sV+X&xoA6ylP=`MnNs6^vQ#r0p+(I)+N zZ8rhD@#%i;U;p{<*8c5(_ithZty}XT0OQDwy|`oRbC~t3vG-YSXqMqk%Fw6cEjxL!8ZkcQHWR4X<2AP4c0KfG+tc1ZfVBENu2?TqTNqV?T zvD!+Df1=%5680=NE!U*=Wf84sC0^AQ>~pRx=jH$%B4WK^{t#cnNHc5hbu|i}CowYO z-m{lG7@S`g8=`go>eZ{P zk`%IG87YnZrJ;9OC~MaVJ;^i<1nd|lAN^fiz3Vv%F>?yfgfCjMKOL*{2YLGzi91%z zim*CJiNx3^Q3%eXmFV}eHKswMsR%G7Z;2VY9`lwzK$ssir~Q&MFx<;bRxWqz<`|b; zN>cJap_Nq|W8ZHpEW5hEMa?I)GrTGeCq_rn2yL2IF35Pn>k_km_~G|?NRER+>(PC! z^WkBMZ-jGra$Y=KMy5W+qd3KSK7IJuOvAk_PlAxuEZh3K@4lO4oZ}K`tOX&iHqj;l z1UVc-*WS&CMaVTN=|{=L^>qpm0h09|x5!1w09c-D*B*^C%qc_~Ax*h3=DidmouqX2 zk-#xYgDIRx(Z|O>R!$T=H^b$qc7&n0=DDq|@NSy&9E&w)+`LTCOF78I-@<$07#ZnZ z(KYeUetXg0s2@Kqan$qN|3{UH$ke>OEfcpnPK&%>;Dqm1uP+as&;ItkV}(0^!mTgA z`TYxe&UyYB_%(dvF%QC!vSIBQQ|OSu!8%OA^pC2VanmvE(dRmtHu_oM@vQ9QWtsVZif3da`6YD0ee}XV;{*M25^ZP^pEJSZddq+X?BUxY^e zZbl0mEs-|IzZhJ>;5-XpFMsB*zInR#XKz~5YEnztX)7k%QgzP~E^cc0`!uCtr}bow zBgi0;>-WhJ%loZr9glxr`}Sqcu_HXLQ0u9Nlv>AAA#q7I%wt=D=%|zTK71>=qrLXd z%52-IPL;*nh|)@KDkFW@RvW4%KF-`G?%HOB1XcSlRHog3HVo6y|n4 zeEn*)dhWGG5pZ=$fv_!Z+GD&s4T(VO6+@Wf(b+mdeTRTF~LJ{dsK)O=Y9MD)WGGzBdyyqd>VeTld$-tb}9OI68yEP=)Yf)*P zkfU2<(6Z)2TtbT#*?g}Xzih-O30N?bWR#vW{YPmki1;8uxY{dC4?|n-3^MgR9rKHP z1&hWSj(|f?o7a5{b}pl~wNt(!iRP^5ZKa)38n~Xf)6Nf{x5y!T(C@?$wDZ9DngUaD z##IW;Nwtli%j89fHy_&xJ_ev*_+{3>|MIVXSGH;G*kDi3r~O+`k!4!pc7%A-!hSeD z?{zg6;YqH&r)jJ^)u3Lb;Dpbk;c-1Y#=N9|e+)M+`hB(*3g4_2P0+Do?ilWyTut95 zjMbiPTxBU412=v!zlQA*F`bAum~cU=TYZwUCTQNOOmcLSp>+Y~^I?inQ|E%`Ak&ac8n9+z%|Q3HQH*3(d+W3$*oC4=0XI zH}G8NuGVRG-wB@xAu#j2qsol9ap4oXb$|STfN}j*3YsJlVV~K%H6`~d7pQygh2xK< zi?Wutst2YdF$hjmWZWP3Shh_1M_h3oey|9@2H9B-->=3wUwrvzb?)kSWBTP`erRNM z?drVM=k0j&B$Ey5{v&M)ZDJ63}o{l)-hIpCKmt&&@zm1fqBy|fAU3*6TpV30u z{;Z%D5Cdxg5U*Z?ZiGoYOq4LOqW~XnW2jR=6AA%6HXWwL3>h25afoRlx45A~8h{g= z-sg5}5*GAsY5)L007*naR2MDUNkZT>_nJvR3)y9J@zHa$OuBd9GrQNjW^3H0xh*0v zi=Ro>d#;}*vn~*|8ee18{FtJl^9FZYph+kibBi~@*;3sb3oZD9i=>6q0ob`d zZUdC2$@(Lzw}Tu9+_!NSNhpXIewAzLG-07;N4p_4O5=j!3h4Q|U2MdRXvfdXlq6VXJhF!Eaj37P z&3Zd4xVK~d`**p3z>r;4caJjn_UkHh7PEWUd{R8|Go!!ljfxvK@2j4tZfy6(PFZi- z6{V5o1|>*j3ewJZ6R28>iHAt}|8RD<_WQThceRtfY~js~nq3z!{7strb>|xTnTKSt z&AxcSRqfuSR5zz(<$?{m?*jz@jGy<6bd=G2C9GU0_^v4dWx;;x^K%>N76;vo!Ex=| zBQtazja$ZJ9B*C{Tx3hyisxzWV%~`Dwyn}15i`1KY!nwID?zGt568{CHQQ}|a8lUd zf|7@hFv8APt4UxDky_XO(t=RKasq9=b^Xg{zirMXi)B43>_Cc}zHZ~^ z!y1L`#N$4F%0la436G#AXuj|Q-BoNHpve9SH)-P#-xJ?GWqHNs*eUp^`QcS8Jn-A^ zJKc2fl*xo|ohYfFYzW=l7eR#nQ;5Syu|&9L4l4yoyd2L(=VK8SI?{P&)g-=w4z8^5 zWhLBJLTuT}Xr}jH{NozuJJ*_ctq$M$&Eaq7I=ru5&bO}Otlc5lgh=Rv#auIsyFx(d zJ;okiPNAU15;PrPrgaZ$p|mxM@!a`^z?@_|R&C*l8E4PsXM z5YEPtEW-v9@8tbZ5`bTrXN6OnQGJ~mGs@MXy{V{8k=>N|=# z?c_QlsH^DTf$r8#%)E}*%B!xP(G{(;{tjl(`I6p0e^i;7kp^)pYzHzbz?FIO%u`!VB zHvdq}_M?o}lApM`17n1~%oTG6A8QXD2n@q|8uz0-95+xkn=np;f&JirmT-TgV-71f ze7elawha)fdB~kbo4-!zS}#q-x!|VGHKt-6FtE*HerMs}P0TClz4n-UkM%BbOw!M# z(ux@LUS$@D@8yp4IXI0Qt>b7%blns{H@{!@_Z2g3rdpYTF#> zJS3U*hKH?eZrGsP^SOdqQb)zkE&XKf4#!9!u>SHCVcxtbtTvraX!hF)p3mIR&6@xd zu27$Rn9`@UnK&O|g?+OYv|HS)fx~vK`IJn_nniaMKYI|eZZ1=-Sa45L5?{1?%S(z( zWelGSF(`D$WALAw+`&&uTH<~1pYAy)pL3n(2~n%Z@`D=OU$PGI5bv{=jfIe7m1(

b!_= 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%0Dgvr7YaW7keeONj8a6v~}k%VPy*VO(Y@ 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%0DQ*yfSR|J7kfb9w@4tz$*4( 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 diff --git a/ui/app/keychains/hd/create-vault-complete.js b/ui/app/keychains/hd/create-vault-complete.js deleted file mode 100644 index 5ab5d4c332d6..000000000000 --- a/ui/app/keychains/hd/create-vault-complete.js +++ /dev/null @@ -1,91 +0,0 @@ -const inherits = require('util').inherits -const Component = require('react').Component -const connect = require('react-redux').connect -const h = require('react-hyperscript') -const actions = require('../../actions') -const exportAsFile = require('../../util').exportAsFile - -module.exports = connect(mapStateToProps)(CreateVaultCompleteScreen) - -inherits(CreateVaultCompleteScreen, Component) -function CreateVaultCompleteScreen () { - Component.call(this) -} - -function mapStateToProps (state) { - return { - seed: state.appState.currentView.seedWords, - cachedSeed: state.metamask.seedWords, - } -} - -CreateVaultCompleteScreen.prototype.render = function () { - var state = this.props - var seed = state.seed || state.cachedSeed || '' - - return ( - - h('.initialize-screen.flex-column.flex-center.flex-grow', [ - - // // subtitle and nav - // h('.section-title.flex-row.flex-center', [ - // h('h2.page-subtitle', 'Vault Created'), - // ]), - - h('h3.flex-center.text-transform-uppercase', { - style: { - background: '#EBEBEB', - color: '#AEAEAE', - marginTop: 36, - marginBottom: 8, - width: '100%', - fontSize: '20px', - padding: 6, - }, - }, [ - 'Vault Created', - ]), - - h('div', { - style: { - fontSize: '1em', - marginTop: '10px', - textAlign: 'center', - }, - }, [ - h('span.error', 'These 12 words are the only way to restore your MetaMask accounts.\nSave them somewhere safe and secret.'), - ]), - - h('textarea.twelve-word-phrase', { - readOnly: true, - value: seed, - }), - - h('button.primary', { - onClick: () => this.confirmSeedWords() - .then(account => this.showAccountDetail(account)), - style: { - margin: '24px', - fontSize: '0.9em', - marginBottom: '10px', - }, - }, 'I\'ve copied it somewhere safe'), - - h('button.primary', { - onClick: () => exportAsFile(`MetaMask Seed Words`, seed), - style: { - margin: '10px', - fontSize: '0.9em', - }, - }, 'Save Seed Words As File'), - ]) - ) -} - -CreateVaultCompleteScreen.prototype.confirmSeedWords = function () { - return this.props.dispatch(actions.confirmSeedWords()) -} - -CreateVaultCompleteScreen.prototype.showAccountDetail = function (account) { - return this.props.dispatch(actions.showAccountDetail(account)) -} diff --git a/ui/app/keychains/hd/restore-vault.js b/ui/app/keychains/hd/restore-vault.js deleted file mode 100644 index 913d20505d48..000000000000 --- a/ui/app/keychains/hd/restore-vault.js +++ /dev/null @@ -1,181 +0,0 @@ -const inherits = require('util').inherits -const PropTypes = require('prop-types') -const PersistentForm = require('../../../lib/persistent-form') -const connect = require('react-redux').connect -const h = require('react-hyperscript') -const actions = require('../../actions') -const log = require('loglevel') - -RestoreVaultScreen.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToProps)(RestoreVaultScreen) - - -inherits(RestoreVaultScreen, PersistentForm) -function RestoreVaultScreen () { - PersistentForm.call(this) -} - -function mapStateToProps (state) { - return { - warning: state.appState.warning, - forgottenPassword: state.appState.forgottenPassword, - } -} - -RestoreVaultScreen.prototype.render = function () { - var state = this.props - this.persistentFormParentId = 'restore-vault-form' - - return ( - - h('.initialize-screen.flex-column.flex-center.flex-grow', [ - - h('h3.flex-center.text-transform-uppercase', { - style: { - background: '#EBEBEB', - color: '#AEAEAE', - marginBottom: 24, - width: '100%', - fontSize: '20px', - padding: 6, - }, - }, [ - this.context.t('restoreVault'), - ]), - - // wallet seed entry - h('h3', this.context.t('walletSeed')), - h('textarea.twelve-word-phrase.letter-spacey', { - dataset: { - persistentFormId: 'wallet-seed', - }, - placeholder: this.context.t('secretPhrase'), - }), - - // password - h('input.large-input.letter-spacey', { - type: 'password', - id: 'password-box', - placeholder: this.context.t('newPassword8Chars'), - dataset: { - persistentFormId: 'password', - }, - style: { - width: 260, - marginTop: 12, - }, - }), - - // confirm password - h('input.large-input.letter-spacey', { - type: 'password', - id: 'password-box-confirm', - placeholder: this.context.t('confirmPassword'), - onKeyPress: this.createOnEnter.bind(this), - dataset: { - persistentFormId: 'password-confirmation', - }, - style: { - width: 260, - marginTop: 16, - }, - }), - - (state.warning) && ( - h('span.error.in-progress-notification', state.warning) - ), - - // submit - - h('.flex-row.flex-space-between', { - style: { - marginTop: 30, - width: '50%', - }, - }, [ - - // cancel - h('button.primary', { - onClick: this.showInitializeMenu.bind(this), - style: { - textTransform: 'uppercase', - }, - }, this.context.t('cancel')), - - // submit - h('button.primary', { - onClick: this.createNewVaultAndRestore.bind(this), - style: { - textTransform: 'uppercase', - }, - }, this.context.t('ok')), - ]), - ]) - ) -} - -RestoreVaultScreen.prototype.showInitializeMenu = function () { - const { dispatch, forgottenPassword } = this.props - dispatch(actions.unMarkPasswordForgotten()) - .then(() => { - if (forgottenPassword) { - dispatch(actions.backToUnlockView()) - } else { - dispatch(actions.showInitializeMenu()) - } - }) -} - -RestoreVaultScreen.prototype.createOnEnter = function (event) { - if (event.key === 'Enter') { - this.createNewVaultAndRestore() - } -} - -RestoreVaultScreen.prototype.createNewVaultAndRestore = function () { - // check password - var passwordBox = document.getElementById('password-box') - var password = passwordBox.value - var passwordConfirmBox = document.getElementById('password-box-confirm') - var passwordConfirm = passwordConfirmBox.value - if (password.length < 8) { - this.warning = this.context.t('passwordNotLongEnough') - - this.props.dispatch(actions.displayWarning(this.warning)) - return - } - if (password !== passwordConfirm) { - this.warning = this.context.t('passwordsDontMatch') - this.props.dispatch(actions.displayWarning(this.warning)) - return - } - // check seed - var seedBox = document.querySelector('textarea.twelve-word-phrase') - var seed = seedBox.value.trim() - - // true if the string has more than a space between words. - if (seed.split(' ').length > 1) { - this.warning = this.context.t('spaceBetween') - this.props.dispatch(actions.displayWarning(this.warning)) - return - } - // true if seed contains a character that is not between a-z or a space - if (!seed.match(/^[a-z ]+$/)) { - this.warning = this.context.t('loweCaseWords') - this.props.dispatch(actions.displayWarning(this.warning)) - return - } - if (seed.split(' ').length !== 12) { - this.warning = this.context.t('seedPhraseReq') - this.props.dispatch(actions.displayWarning(this.warning)) - return - } - // submit - this.warning = null - this.props.dispatch(actions.displayWarning(this.warning)) - this.props.dispatch(actions.createNewVaultAndRestore(password, seed)) - .catch(err => log.error(err.message)) -} diff --git a/ui/app/components/pages/add-token/add-token.component.js b/ui/app/pages/add-token/add-token.component.js similarity index 96% rename from ui/app/components/pages/add-token/add-token.component.js rename to ui/app/pages/add-token/add-token.component.js index 198889cf2ad2..40c1ff7fd321 100644 --- a/ui/app/components/pages/add-token/add-token.component.js +++ b/ui/app/pages/add-token/add-token.component.js @@ -2,13 +2,13 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import ethUtil from 'ethereumjs-util' import { checkExistingAddresses } from './util' -import { tokenInfoGetter } from '../../../token-util' -import { DEFAULT_ROUTE, CONFIRM_ADD_TOKEN_ROUTE } from '../../../routes' -import TextField from '../../text-field' +import { tokenInfoGetter } from '../../helpers/utils/token-util' +import { DEFAULT_ROUTE, CONFIRM_ADD_TOKEN_ROUTE } from '../../helpers/constants/routes' +import TextField from '../../components/ui/text-field' import TokenList from './token-list' import TokenSearch from './token-search' -import PageContainer from '../../page-container' -import { Tabs, Tab } from '../../tabs' +import PageContainer from '../../components/ui/page-container' +import { Tabs, Tab } from '../../components/ui/tabs' const emptyAddr = '0x0000000000000000000000000000000000000000' const SEARCH_TAB = 'SEARCH' diff --git a/ui/app/components/pages/add-token/add-token.container.js b/ui/app/pages/add-token/add-token.container.js similarity index 97% rename from ui/app/components/pages/add-token/add-token.container.js rename to ui/app/pages/add-token/add-token.container.js index 87671b156703..eee16dfc789e 100644 --- a/ui/app/components/pages/add-token/add-token.container.js +++ b/ui/app/pages/add-token/add-token.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import AddToken from './add-token.component' -const { setPendingTokens, clearPendingTokens } = require('../../../actions') +const { setPendingTokens, clearPendingTokens } = require('../../store/actions') const mapStateToProps = ({ metamask }) => { const { identities, tokens, pendingTokens } = metamask diff --git a/ui/app/components/pages/add-token/index.js b/ui/app/pages/add-token/index.js similarity index 100% rename from ui/app/components/pages/add-token/index.js rename to ui/app/pages/add-token/index.js diff --git a/ui/app/components/pages/add-token/index.scss b/ui/app/pages/add-token/index.scss similarity index 95% rename from ui/app/components/pages/add-token/index.scss rename to ui/app/pages/add-token/index.scss index 1690c7654392..ef6802f9635f 100644 --- a/ui/app/components/pages/add-token/index.scss +++ b/ui/app/pages/add-token/index.scss @@ -1,4 +1,4 @@ -@import './token-list/index'; +@import 'token-list/index'; .add-token { &__custom-token-form { diff --git a/ui/app/components/pages/add-token/token-list/index.js b/ui/app/pages/add-token/token-list/index.js similarity index 100% rename from ui/app/components/pages/add-token/token-list/index.js rename to ui/app/pages/add-token/token-list/index.js diff --git a/ui/app/components/pages/add-token/token-list/index.scss b/ui/app/pages/add-token/token-list/index.scss similarity index 96% rename from ui/app/components/pages/add-token/token-list/index.scss rename to ui/app/pages/add-token/token-list/index.scss index e32739d59646..b7787a18e5d7 100644 --- a/ui/app/components/pages/add-token/token-list/index.scss +++ b/ui/app/pages/add-token/token-list/index.scss @@ -1,4 +1,4 @@ -@import './token-list-placeholder/index'; +@import 'token-list-placeholder/index'; .token-list { &__title { diff --git a/ui/app/components/pages/add-token/token-list/token-list-placeholder/index.js b/ui/app/pages/add-token/token-list/token-list-placeholder/index.js similarity index 100% rename from ui/app/components/pages/add-token/token-list/token-list-placeholder/index.js rename to ui/app/pages/add-token/token-list/token-list-placeholder/index.js diff --git a/ui/app/components/pages/add-token/token-list/token-list-placeholder/index.scss b/ui/app/pages/add-token/token-list/token-list-placeholder/index.scss similarity index 100% rename from ui/app/components/pages/add-token/token-list/token-list-placeholder/index.scss rename to ui/app/pages/add-token/token-list/token-list-placeholder/index.scss diff --git a/ui/app/components/pages/add-token/token-list/token-list-placeholder/token-list-placeholder.component.js b/ui/app/pages/add-token/token-list/token-list-placeholder/token-list-placeholder.component.js similarity index 100% rename from ui/app/components/pages/add-token/token-list/token-list-placeholder/token-list-placeholder.component.js rename to ui/app/pages/add-token/token-list/token-list-placeholder/token-list-placeholder.component.js diff --git a/ui/app/components/pages/add-token/token-list/token-list.component.js b/ui/app/pages/add-token/token-list/token-list.component.js similarity index 100% rename from ui/app/components/pages/add-token/token-list/token-list.component.js rename to ui/app/pages/add-token/token-list/token-list.component.js diff --git a/ui/app/components/pages/add-token/token-list/token-list.container.js b/ui/app/pages/add-token/token-list/token-list.container.js similarity index 100% rename from ui/app/components/pages/add-token/token-list/token-list.container.js rename to ui/app/pages/add-token/token-list/token-list.container.js diff --git a/ui/app/components/pages/add-token/token-search/index.js b/ui/app/pages/add-token/token-search/index.js similarity index 100% rename from ui/app/components/pages/add-token/token-search/index.js rename to ui/app/pages/add-token/token-search/index.js diff --git a/ui/app/components/pages/add-token/token-search/token-search.component.js b/ui/app/pages/add-token/token-search/token-search.component.js similarity index 97% rename from ui/app/components/pages/add-token/token-search/token-search.component.js rename to ui/app/pages/add-token/token-search/token-search.component.js index 036b2db1e91e..5542a19ff438 100644 --- a/ui/app/components/pages/add-token/token-search/token-search.component.js +++ b/ui/app/pages/add-token/token-search/token-search.component.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types' import contractMap from 'eth-contract-metadata' import Fuse from 'fuse.js' import InputAdornment from '@material-ui/core/InputAdornment' -import TextField from '../../../text-field' +import TextField from '../../../components/ui/text-field' const contractList = Object.entries(contractMap) .map(([ _, tokenData]) => tokenData) diff --git a/ui/app/components/pages/add-token/util.js b/ui/app/pages/add-token/util.js similarity index 100% rename from ui/app/components/pages/add-token/util.js rename to ui/app/pages/add-token/util.js diff --git a/ui/app/components/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js b/ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js similarity index 94% rename from ui/app/components/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js rename to ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js index ee5d6fa64365..7edb8f541064 100644 --- a/ui/app/components/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js +++ b/ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js @@ -1,9 +1,9 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import { DEFAULT_ROUTE } from '../../../routes' -import Button from '../../button' -import Identicon from '../../../components/identicon' -import TokenBalance from '../../token-balance' +import { DEFAULT_ROUTE } from '../../helpers/constants/routes' +import Button from '../../components/ui/button' +import Identicon from '../../components/ui/identicon' +import TokenBalance from '../../components/ui/token-balance' export default class ConfirmAddSuggestedToken extends Component { static contextTypes = { diff --git a/ui/app/components/pages/confirm-add-suggested-token/confirm-add-suggested-token.container.js b/ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.container.js similarity index 91% rename from ui/app/components/pages/confirm-add-suggested-token/confirm-add-suggested-token.container.js rename to ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.container.js index 1f2737e529b3..a90fe148fc7d 100644 --- a/ui/app/components/pages/confirm-add-suggested-token/confirm-add-suggested-token.container.js +++ b/ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.container.js @@ -5,7 +5,7 @@ import { withRouter } from 'react-router-dom' const extend = require('xtend') -const { addToken, removeSuggestedTokens } = require('../../../actions') +const { addToken, removeSuggestedTokens } = require('../../store/actions') const mapStateToProps = ({ metamask }) => { const { pendingTokens, suggestedTokens } = metamask diff --git a/ui/app/components/pages/confirm-add-suggested-token/index.js b/ui/app/pages/confirm-add-suggested-token/index.js similarity index 100% rename from ui/app/components/pages/confirm-add-suggested-token/index.js rename to ui/app/pages/confirm-add-suggested-token/index.js diff --git a/ui/app/components/pages/confirm-add-token/confirm-add-token.component.js b/ui/app/pages/confirm-add-token/confirm-add-token.component.js similarity index 93% rename from ui/app/components/pages/confirm-add-token/confirm-add-token.component.js rename to ui/app/pages/confirm-add-token/confirm-add-token.component.js index d3fec79d7f09..c0ec624ac29b 100644 --- a/ui/app/components/pages/confirm-add-token/confirm-add-token.component.js +++ b/ui/app/pages/confirm-add-token/confirm-add-token.component.js @@ -1,9 +1,9 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import { DEFAULT_ROUTE, ADD_TOKEN_ROUTE } from '../../../routes' -import Button from '../../button' -import Identicon from '../../identicon' -import TokenBalance from '../../token-balance' +import { DEFAULT_ROUTE, ADD_TOKEN_ROUTE } from '../../helpers/constants/routes' +import Button from '../../components/ui/button' +import Identicon from '../../components/ui/identicon' +import TokenBalance from '../../components/ui/token-balance' export default class ConfirmAddToken extends Component { static contextTypes = { diff --git a/ui/app/components/pages/confirm-add-token/confirm-add-token.container.js b/ui/app/pages/confirm-add-token/confirm-add-token.container.js similarity index 86% rename from ui/app/components/pages/confirm-add-token/confirm-add-token.container.js rename to ui/app/pages/confirm-add-token/confirm-add-token.container.js index 0190024d9b8e..96162617723c 100644 --- a/ui/app/components/pages/confirm-add-token/confirm-add-token.container.js +++ b/ui/app/pages/confirm-add-token/confirm-add-token.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import ConfirmAddToken from './confirm-add-token.component' -const { addTokens, clearPendingTokens } = require('../../../actions') +const { addTokens, clearPendingTokens } = require('../../store/actions') const mapStateToProps = ({ metamask }) => { const { pendingTokens } = metamask diff --git a/ui/app/components/pages/confirm-add-token/index.js b/ui/app/pages/confirm-add-token/index.js similarity index 100% rename from ui/app/components/pages/confirm-add-token/index.js rename to ui/app/pages/confirm-add-token/index.js diff --git a/ui/app/components/pages/confirm-add-token/index.scss b/ui/app/pages/confirm-add-token/index.scss similarity index 100% rename from ui/app/components/pages/confirm-add-token/index.scss rename to ui/app/pages/confirm-add-token/index.scss diff --git a/ui/app/components/pages/confirm-approve/confirm-approve.component.js b/ui/app/pages/confirm-approve/confirm-approve.component.js similarity index 100% rename from ui/app/components/pages/confirm-approve/confirm-approve.component.js rename to ui/app/pages/confirm-approve/confirm-approve.component.js diff --git a/ui/app/components/pages/confirm-approve/confirm-approve.container.js b/ui/app/pages/confirm-approve/confirm-approve.container.js similarity index 80% rename from ui/app/components/pages/confirm-approve/confirm-approve.container.js rename to ui/app/pages/confirm-approve/confirm-approve.container.js index 4ef9f4ced55c..5f8bb8f0b3ea 100644 --- a/ui/app/components/pages/confirm-approve/confirm-approve.container.js +++ b/ui/app/pages/confirm-approve/confirm-approve.container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import ConfirmApprove from './confirm-approve.component' -import { approveTokenAmountAndToAddressSelector } from '../../../selectors/confirm-transaction' +import { approveTokenAmountAndToAddressSelector } from '../../selectors/confirm-transaction' const mapStateToProps = state => { const { confirmTransaction: { tokenProps: { tokenSymbol } = {} } } = state diff --git a/ui/app/components/pages/confirm-approve/index.js b/ui/app/pages/confirm-approve/index.js similarity index 100% rename from ui/app/components/pages/confirm-approve/index.js rename to ui/app/pages/confirm-approve/index.js diff --git a/ui/app/components/pages/confirm-deploy-contract/confirm-deploy-contract.component.js b/ui/app/pages/confirm-deploy-contract/confirm-deploy-contract.component.js similarity index 100% rename from ui/app/components/pages/confirm-deploy-contract/confirm-deploy-contract.component.js rename to ui/app/pages/confirm-deploy-contract/confirm-deploy-contract.component.js diff --git a/ui/app/components/pages/confirm-deploy-contract/confirm-deploy-contract.container.js b/ui/app/pages/confirm-deploy-contract/confirm-deploy-contract.container.js similarity index 100% rename from ui/app/components/pages/confirm-deploy-contract/confirm-deploy-contract.container.js rename to ui/app/pages/confirm-deploy-contract/confirm-deploy-contract.container.js diff --git a/ui/app/components/pages/confirm-deploy-contract/index.js b/ui/app/pages/confirm-deploy-contract/index.js similarity index 100% rename from ui/app/components/pages/confirm-deploy-contract/index.js rename to ui/app/pages/confirm-deploy-contract/index.js diff --git a/ui/app/components/pages/confirm-send-ether/confirm-send-ether.component.js b/ui/app/pages/confirm-send-ether/confirm-send-ether.component.js similarity index 93% rename from ui/app/components/pages/confirm-send-ether/confirm-send-ether.component.js rename to ui/app/pages/confirm-send-ether/confirm-send-ether.component.js index 442a478b846a..8daad675e794 100644 --- a/ui/app/components/pages/confirm-send-ether/confirm-send-ether.component.js +++ b/ui/app/pages/confirm-send-ether/confirm-send-ether.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import ConfirmTransactionBase from '../confirm-transaction-base' -import { SEND_ROUTE } from '../../../routes' +import { SEND_ROUTE } from '../../helpers/constants/routes' export default class ConfirmSendEther extends Component { static contextTypes = { diff --git a/ui/app/components/pages/confirm-send-ether/confirm-send-ether.container.js b/ui/app/pages/confirm-send-ether/confirm-send-ether.container.js similarity index 86% rename from ui/app/components/pages/confirm-send-ether/confirm-send-ether.container.js rename to ui/app/pages/confirm-send-ether/confirm-send-ether.container.js index e48ef54a8404..713da702dbfc 100644 --- a/ui/app/components/pages/confirm-send-ether/confirm-send-ether.container.js +++ b/ui/app/pages/confirm-send-ether/confirm-send-ether.container.js @@ -1,8 +1,8 @@ import { connect } from 'react-redux' import { compose } from 'recompose' import { withRouter } from 'react-router-dom' -import { updateSend } from '../../../actions' -import { clearConfirmTransaction } from '../../../ducks/confirm-transaction.duck' +import { updateSend } from '../../store/actions' +import { clearConfirmTransaction } from '../../ducks/confirm-transaction/confirm-transaction.duck' import ConfirmSendEther from './confirm-send-ether.component' const mapStateToProps = state => { diff --git a/ui/app/components/pages/confirm-send-ether/index.js b/ui/app/pages/confirm-send-ether/index.js similarity index 100% rename from ui/app/components/pages/confirm-send-ether/index.js rename to ui/app/pages/confirm-send-ether/index.js diff --git a/ui/app/components/pages/confirm-send-token/confirm-send-token.component.js b/ui/app/pages/confirm-send-token/confirm-send-token.component.js similarity index 92% rename from ui/app/components/pages/confirm-send-token/confirm-send-token.component.js rename to ui/app/pages/confirm-send-token/confirm-send-token.component.js index cb39e3d7bf5c..7f3b1c082d14 100644 --- a/ui/app/components/pages/confirm-send-token/confirm-send-token.component.js +++ b/ui/app/pages/confirm-send-token/confirm-send-token.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import ConfirmTokenTransactionBase from '../confirm-token-transaction-base' -import { SEND_ROUTE } from '../../../routes' +import { SEND_ROUTE } from '../../helpers/constants/routes' export default class ConfirmSendToken extends Component { static propTypes = { diff --git a/ui/app/components/pages/confirm-send-token/confirm-send-token.container.js b/ui/app/pages/confirm-send-token/confirm-send-token.container.js similarity index 87% rename from ui/app/components/pages/confirm-send-token/confirm-send-token.container.js rename to ui/app/pages/confirm-send-token/confirm-send-token.container.js index d60911e59384..db9b08c48b6b 100644 --- a/ui/app/components/pages/confirm-send-token/confirm-send-token.container.js +++ b/ui/app/pages/confirm-send-token/confirm-send-token.container.js @@ -2,10 +2,10 @@ import { connect } from 'react-redux' import { compose } from 'recompose' import { withRouter } from 'react-router-dom' import ConfirmSendToken from './confirm-send-token.component' -import { clearConfirmTransaction } from '../../../ducks/confirm-transaction.duck' -import { setSelectedToken, updateSend, showSendTokenPage } from '../../../actions' -import { conversionUtil } from '../../../conversion-util' -import { sendTokenTokenAmountAndToAddressSelector } from '../../../selectors/confirm-transaction' +import { clearConfirmTransaction } from '../../ducks/confirm-transaction/confirm-transaction.duck' +import { setSelectedToken, updateSend, showSendTokenPage } from '../../store/actions' +import { conversionUtil } from '../../helpers/utils/conversion-util' +import { sendTokenTokenAmountAndToAddressSelector } from '../../selectors/confirm-transaction' const mapStateToProps = state => { const { tokenAmount } = sendTokenTokenAmountAndToAddressSelector(state) diff --git a/ui/app/components/pages/confirm-send-token/index.js b/ui/app/pages/confirm-send-token/index.js similarity index 100% rename from ui/app/components/pages/confirm-send-token/index.js rename to ui/app/pages/confirm-send-token/index.js diff --git a/ui/app/components/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js b/ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js similarity index 91% rename from ui/app/components/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js rename to ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js index 7f1fb4e491ee..dbda3c1dc473 100644 --- a/ui/app/components/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js +++ b/ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js @@ -1,15 +1,15 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import ConfirmTransactionBase from '../confirm-transaction-base' -import UserPreferencedCurrencyDisplay from '../../user-preferenced-currency-display' +import UserPreferencedCurrencyDisplay from '../../components/app/user-preferenced-currency-display' import { formatCurrency, convertTokenToFiat, addFiat, roundExponential, -} from '../../../helpers/confirm-transaction/util' -import { getWeiHexFromDecimalValue } from '../../../helpers/conversions.util' -import { ETH, PRIMARY } from '../../../constants/common' +} from '../../helpers/utils/confirm-tx.util' +import { getWeiHexFromDecimalValue } from '../../helpers/utils/conversions.util' +import { ETH, PRIMARY } from '../../helpers/constants/common' export default class ConfirmTokenTransactionBase extends Component { static contextTypes = { diff --git a/ui/app/components/pages/confirm-token-transaction-base/confirm-token-transaction-base.container.js b/ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.container.js similarity index 95% rename from ui/app/components/pages/confirm-token-transaction-base/confirm-token-transaction-base.container.js rename to ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.container.js index be38acdb0cc0..f5f30a4605a5 100644 --- a/ui/app/components/pages/confirm-token-transaction-base/confirm-token-transaction-base.container.js +++ b/ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.container.js @@ -3,7 +3,7 @@ import ConfirmTokenTransactionBase from './confirm-token-transaction-base.compon import { tokenAmountAndToAddressSelector, contractExchangeRateSelector, -} from '../../../selectors/confirm-transaction' +} from '../../selectors/confirm-transaction' const mapStateToProps = (state, ownProps) => { const { tokenAmount: ownTokenAmount } = ownProps diff --git a/ui/app/components/pages/confirm-token-transaction-base/index.js b/ui/app/pages/confirm-token-transaction-base/index.js similarity index 100% rename from ui/app/components/pages/confirm-token-transaction-base/index.js rename to ui/app/pages/confirm-token-transaction-base/index.js diff --git a/ui/app/components/pages/confirm-transaction-base/confirm-transaction-base.component.js b/ui/app/pages/confirm-transaction-base/confirm-transaction-base.component.js similarity index 93% rename from ui/app/components/pages/confirm-transaction-base/confirm-transaction-base.component.js rename to ui/app/pages/confirm-transaction-base/confirm-transaction-base.component.js index 8b101b1ba81a..9e749322ff8c 100644 --- a/ui/app/components/pages/confirm-transaction-base/confirm-transaction-base.component.js +++ b/ui/app/pages/confirm-transaction-base/confirm-transaction-base.component.js @@ -1,17 +1,19 @@ import ethUtil from 'ethereumjs-util' import React, { Component } from 'react' import PropTypes from 'prop-types' -import ConfirmPageContainer, { ConfirmDetailRow } from '../../confirm-page-container' -import { isBalanceSufficient } from '../../send/send.utils' -import { DEFAULT_ROUTE, CONFIRM_TRANSACTION_ROUTE } from '../../../routes' +import { ENVIRONMENT_TYPE_NOTIFICATION } from '../../../../app/scripts/lib/enums' +import { getEnvironmentType } from '../../../../app/scripts/lib/util' +import ConfirmPageContainer, { ConfirmDetailRow } from '../../components/app/confirm-page-container' +import { isBalanceSufficient } from '../../components/app/send/send.utils' +import { DEFAULT_ROUTE, CONFIRM_TRANSACTION_ROUTE } from '../../helpers/constants/routes' import { INSUFFICIENT_FUNDS_ERROR_KEY, TRANSACTION_ERROR_KEY, -} from '../../../constants/error-keys' -import { CONFIRMED_STATUS, DROPPED_STATUS } from '../../../constants/transactions' -import UserPreferencedCurrencyDisplay from '../../user-preferenced-currency-display' -import { PRIMARY, SECONDARY } from '../../../constants/common' -import AdvancedGasInputs from '../../gas-customization/advanced-gas-inputs' +} from '../../helpers/constants/error-keys' +import { CONFIRMED_STATUS, DROPPED_STATUS } from '../../helpers/constants/transactions' +import UserPreferencedCurrencyDisplay from '../../components/app/user-preferenced-currency-display' +import { PRIMARY, SECONDARY } from '../../helpers/constants/common' +import AdvancedGasInputs from '../../components/app/gas-customization/advanced-gas-inputs' export default class ConfirmTransactionBase extends Component { static contextTypes = { @@ -474,7 +476,7 @@ export default class ConfirmTransactionBase extends Component { } componentDidMount () { - const { txData: { origin } = {} } = this.props + const { txData: { origin, id } = {}, cancelTransaction } = this.props const { metricsEvent } = this.context metricsEvent({ eventOpts: { @@ -486,6 +488,22 @@ export default class ConfirmTransactionBase extends Component { origin, }, }) + + if (getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_NOTIFICATION) { + window.onbeforeunload = () => { + metricsEvent({ + eventOpts: { + category: 'Transactions', + action: 'Confirm Screen', + name: 'Cancel Tx Via Notification Close', + }, + customVariables: { + origin, + }, + }) + cancelTransaction({ id }) + } + } } render () { diff --git a/ui/app/components/pages/confirm-transaction-base/confirm-transaction-base.container.js b/ui/app/pages/confirm-transaction-base/confirm-transaction-base.container.js similarity index 92% rename from ui/app/components/pages/confirm-transaction-base/confirm-transaction-base.container.js rename to ui/app/pages/confirm-transaction-base/confirm-transaction-base.container.js index 22f5099058d0..83543f1a442b 100644 --- a/ui/app/components/pages/confirm-transaction-base/confirm-transaction-base.container.js +++ b/ui/app/pages/confirm-transaction-base/confirm-transaction-base.container.js @@ -7,18 +7,18 @@ import ConfirmTransactionBase from './confirm-transaction-base.component' import { clearConfirmTransaction, updateGasAndCalculate, -} from '../../../ducks/confirm-transaction.duck' -import { clearSend, cancelTx, cancelTxs, updateAndApproveTx, showModal, setMetaMetricsSendCount } from '../../../actions' +} from '../../ducks/confirm-transaction/confirm-transaction.duck' +import { clearSend, cancelTx, cancelTxs, updateAndApproveTx, showModal, setMetaMetricsSendCount } from '../../store/actions' import { INSUFFICIENT_FUNDS_ERROR_KEY, GAS_LIMIT_TOO_LOW_ERROR_KEY, -} from '../../../constants/error-keys' -import { getHexGasTotal } from '../../../helpers/confirm-transaction/util' -import { isBalanceSufficient, calcGasTotal } from '../../send/send.utils' -import { conversionGreaterThan } from '../../../conversion-util' -import { MIN_GAS_LIMIT_DEC } from '../../send/send.constants' -import { checksumAddress, addressSlicer, valuesFor } from '../../../util' -import {getMetaMaskAccounts, getAdvancedInlineGasShown, preferencesSelector, getIsMainnet} from '../../../selectors' +} from '../../helpers/constants/error-keys' +import { getHexGasTotal } from '../../helpers/utils/confirm-tx.util' +import { isBalanceSufficient, calcGasTotal } from '../../components/app/send/send.utils' +import { conversionGreaterThan } from '../../helpers/utils/conversion-util' +import { MIN_GAS_LIMIT_DEC } from '../../components/app/send/send.constants' +import { checksumAddress, addressSlicer, valuesFor } from '../../helpers/utils/util' +import {getMetaMaskAccounts, getAdvancedInlineGasShown, preferencesSelector, getIsMainnet} from '../../selectors/selectors' const casedContractMap = Object.keys(contractMap).reduce((acc, base) => { return { diff --git a/ui/app/components/pages/confirm-transaction-base/index.js b/ui/app/pages/confirm-transaction-base/index.js similarity index 100% rename from ui/app/components/pages/confirm-transaction-base/index.js rename to ui/app/pages/confirm-transaction-base/index.js diff --git a/ui/app/components/pages/confirm-transaction-base/tests/confirm-transaction-base.component.test.js b/ui/app/pages/confirm-transaction-base/tests/confirm-transaction-base.component.test.js similarity index 100% rename from ui/app/components/pages/confirm-transaction-base/tests/confirm-transaction-base.component.test.js rename to ui/app/pages/confirm-transaction-base/tests/confirm-transaction-base.component.test.js diff --git a/ui/app/components/pages/confirm-transaction-switch/confirm-transaction-switch.component.js b/ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.component.js similarity index 92% rename from ui/app/components/pages/confirm-transaction-switch/confirm-transaction-switch.component.js rename to ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.component.js index cf79b94bc232..cd471b822fc1 100644 --- a/ui/app/components/pages/confirm-transaction-switch/confirm-transaction-switch.component.js +++ b/ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import { Redirect } from 'react-router-dom' -import Loading from '../../loading-screen' +import Loading from '../../components/ui/loading-screen' import { CONFIRM_TRANSACTION_ROUTE, CONFIRM_DEPLOY_CONTRACT_PATH, @@ -11,13 +11,13 @@ import { CONFIRM_TRANSFER_FROM_PATH, CONFIRM_TOKEN_METHOD_PATH, SIGNATURE_REQUEST_PATH, -} from '../../../routes' -import { isConfirmDeployContract } from '../../../helpers/transactions.util' +} from '../../helpers/constants/routes' +import { isConfirmDeployContract } from '../../helpers/utils/transactions.util' import { TOKEN_METHOD_TRANSFER, TOKEN_METHOD_APPROVE, TOKEN_METHOD_TRANSFER_FROM, -} from '../../../constants/transactions' +} from '../../helpers/constants/transactions' export default class ConfirmTransactionSwitch extends Component { static propTypes = { diff --git a/ui/app/components/pages/confirm-transaction-switch/confirm-transaction-switch.container.js b/ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.container.js similarity index 100% rename from ui/app/components/pages/confirm-transaction-switch/confirm-transaction-switch.container.js rename to ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.container.js diff --git a/ui/app/components/pages/confirm-transaction-switch/confirm-transaction-switch.util.js b/ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.util.js similarity index 100% rename from ui/app/components/pages/confirm-transaction-switch/confirm-transaction-switch.util.js rename to ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.util.js diff --git a/ui/app/components/pages/confirm-transaction-switch/index.js b/ui/app/pages/confirm-transaction-switch/index.js similarity index 100% rename from ui/app/components/pages/confirm-transaction-switch/index.js rename to ui/app/pages/confirm-transaction-switch/index.js diff --git a/ui/app/conf-tx.js b/ui/app/pages/confirm-transaction/conf-tx.js similarity index 94% rename from ui/app/conf-tx.js rename to ui/app/pages/confirm-transaction/conf-tx.js index 34f5466e2eef..f9af6624e5e6 100644 --- a/ui/app/conf-tx.js +++ b/ui/app/pages/confirm-transaction/conf-tx.js @@ -4,15 +4,15 @@ const h = require('react-hyperscript') const connect = require('react-redux').connect const { withRouter } = require('react-router-dom') const { compose } = require('recompose') -const actions = require('./actions') -const txHelper = require('../lib/tx-helper') +const actions = require('../../store/actions') +const txHelper = require('../../../lib/tx-helper') const log = require('loglevel') const R = require('ramda') -const SignatureRequest = require('./components/signature-request') -const Loading = require('./components/loading-screen') -const { DEFAULT_ROUTE } = require('./routes') -const { getMetaMaskAccounts } = require('./selectors') +const SignatureRequest = require('../../components/app/signature-request') +const Loading = require('../../components/ui/loading-screen') +const { DEFAULT_ROUTE } = require('../../helpers/constants/routes') +const { getMetaMaskAccounts } = require('../../selectors/selectors') module.exports = compose( withRouter, diff --git a/ui/app/components/pages/confirm-transaction/confirm-transaction.component.js b/ui/app/pages/confirm-transaction/confirm-transaction.component.js similarity index 97% rename from ui/app/components/pages/confirm-transaction/confirm-transaction.component.js rename to ui/app/pages/confirm-transaction/confirm-transaction.component.js index 2e460f3778b0..35b8dc5aa5e9 100644 --- a/ui/app/components/pages/confirm-transaction/confirm-transaction.component.js +++ b/ui/app/pages/confirm-transaction/confirm-transaction.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import { Switch, Route } from 'react-router-dom' -import Loading from '../../loading-screen' +import Loading from '../../components/ui/loading-screen' import ConfirmTransactionSwitch from '../confirm-transaction-switch' import ConfirmTransactionBase from '../confirm-transaction-base' import ConfirmSendEther from '../confirm-send-ether' @@ -9,7 +9,7 @@ import ConfirmSendToken from '../confirm-send-token' import ConfirmDeployContract from '../confirm-deploy-contract' import ConfirmApprove from '../confirm-approve' import ConfirmTokenTransactionBase from '../confirm-token-transaction-base' -import ConfTx from '../../../conf-tx' +import ConfTx from './conf-tx' import { DEFAULT_ROUTE, CONFIRM_TRANSACTION_ROUTE, @@ -20,7 +20,7 @@ import { CONFIRM_TRANSFER_FROM_PATH, CONFIRM_TOKEN_METHOD_PATH, SIGNATURE_REQUEST_PATH, -} from '../../../routes' +} from '../../helpers/constants/routes' export default class ConfirmTransaction extends Component { static propTypes = { diff --git a/ui/app/components/pages/confirm-transaction/confirm-transaction.container.js b/ui/app/pages/confirm-transaction/confirm-transaction.container.js similarity index 79% rename from ui/app/components/pages/confirm-transaction/confirm-transaction.container.js rename to ui/app/pages/confirm-transaction/confirm-transaction.container.js index 46342dc76854..2dd5e833e9a1 100644 --- a/ui/app/components/pages/confirm-transaction/confirm-transaction.container.js +++ b/ui/app/pages/confirm-transaction/confirm-transaction.container.js @@ -4,13 +4,13 @@ import { withRouter } from 'react-router-dom' import { setTransactionToConfirm, clearConfirmTransaction, -} from '../../../ducks/confirm-transaction.duck' +} from '../../ducks/confirm-transaction/confirm-transaction.duck' import { fetchBasicGasAndTimeEstimates, -} from '../../../ducks/gas.duck' +} from '../../ducks/gas/gas.duck' import ConfirmTransaction from './confirm-transaction.component' -import { getTotalUnapprovedCount } from '../../../selectors' -import { unconfirmedTransactionsListSelector } from '../../../selectors/confirm-transaction' +import { getTotalUnapprovedCount } from '../../selectors/selectors' +import { unconfirmedTransactionsListSelector } from '../../selectors/confirm-transaction' const mapStateToProps = state => { const { metamask: { send }, confirmTransaction } = state diff --git a/ui/app/components/pages/confirm-transaction/index.js b/ui/app/pages/confirm-transaction/index.js similarity index 100% rename from ui/app/components/pages/confirm-transaction/index.js rename to ui/app/pages/confirm-transaction/index.js diff --git a/ui/app/components/pages/create-account/connect-hardware/account-list.js b/ui/app/pages/create-account/connect-hardware/account-list.js similarity index 98% rename from ui/app/components/pages/create-account/connect-hardware/account-list.js rename to ui/app/pages/create-account/connect-hardware/account-list.js index c63de234a9b3..617fb8833568 100644 --- a/ui/app/components/pages/create-account/connect-hardware/account-list.js +++ b/ui/app/pages/create-account/connect-hardware/account-list.js @@ -1,9 +1,9 @@ const { Component } = require('react') const PropTypes = require('prop-types') const h = require('react-hyperscript') -const genAccountLink = require('../../../../../lib/account-link.js') +const genAccountLink = require('../../../../lib/account-link.js') const Select = require('react-select').default -import Button from '../../../button' +import Button from '../../../components/ui/button' class AccountList extends Component { constructor (props, context) { diff --git a/ui/app/components/pages/create-account/connect-hardware/connect-screen.js b/ui/app/pages/create-account/connect-hardware/connect-screen.js similarity index 99% rename from ui/app/components/pages/create-account/connect-hardware/connect-screen.js rename to ui/app/pages/create-account/connect-hardware/connect-screen.js index 49a5610c1b9a..7e9dee97085f 100644 --- a/ui/app/components/pages/create-account/connect-hardware/connect-screen.js +++ b/ui/app/pages/create-account/connect-hardware/connect-screen.js @@ -1,7 +1,7 @@ const { Component } = require('react') const PropTypes = require('prop-types') const h = require('react-hyperscript') -import Button from '../../../button' +import Button from '../../../components/ui/button' class ConnectScreen extends Component { constructor (props, context) { diff --git a/ui/app/components/pages/create-account/connect-hardware/index.js b/ui/app/pages/create-account/connect-hardware/index.js similarity index 95% rename from ui/app/components/pages/create-account/connect-hardware/index.js rename to ui/app/pages/create-account/connect-hardware/index.js index 712cc5cbb712..1398fa680291 100644 --- a/ui/app/components/pages/create-account/connect-hardware/index.js +++ b/ui/app/pages/create-account/connect-hardware/index.js @@ -2,14 +2,14 @@ const { Component } = require('react') const PropTypes = require('prop-types') const h = require('react-hyperscript') const connect = require('react-redux').connect -const actions = require('../../../../actions') -const { getMetaMaskAccounts } = require('../../../../selectors') +const actions = require('../../../store/actions') +const { getMetaMaskAccounts } = require('../../../selectors/selectors') const ConnectScreen = require('./connect-screen') const AccountList = require('./account-list') -const { DEFAULT_ROUTE } = require('../../../../routes') -const { formatBalance } = require('../../../../util') -const { getPlatform } = require('../../../../../../app/scripts/lib/util') -const { PLATFORM_FIREFOX } = require('../../../../../../app/scripts/lib/enums') +const { DEFAULT_ROUTE } = require('../../../helpers/constants/routes') +const { formatBalance } = require('../../../helpers/utils/util') +const { getPlatform } = require('../../../../../app/scripts/lib/util') +const { PLATFORM_FIREFOX } = require('../../../../../app/scripts/lib/enums') class ConnectHardwareForm extends Component { constructor (props, context) { diff --git a/ui/app/components/pages/create-account/import-account/index.js b/ui/app/pages/create-account/import-account/index.js similarity index 100% rename from ui/app/components/pages/create-account/import-account/index.js rename to ui/app/pages/create-account/import-account/index.js diff --git a/ui/app/components/pages/create-account/import-account/json.js b/ui/app/pages/create-account/import-account/json.js similarity index 94% rename from ui/app/components/pages/create-account/import-account/json.js rename to ui/app/pages/create-account/import-account/json.js index 9aeea5579c3e..17bef763c221 100644 --- a/ui/app/components/pages/create-account/import-account/json.js +++ b/ui/app/pages/create-account/import-account/json.js @@ -4,12 +4,12 @@ const h = require('react-hyperscript') const { withRouter } = require('react-router-dom') const { compose } = require('recompose') const connect = require('react-redux').connect -const actions = require('../../../../actions') +const actions = require('../../../store/actions') const FileInput = require('react-simple-file-input').default -const { DEFAULT_ROUTE } = require('../../../../routes') -const { getMetaMaskAccounts } = require('../../../../selectors') +const { DEFAULT_ROUTE } = require('../../../helpers/constants/routes') +const { getMetaMaskAccounts } = require('../../../selectors/selectors') const HELP_LINK = 'https://support.metamask.io/kb/article/7-importing-accounts' -import Button from '../../../button' +import Button from '../../../components/ui/button' class JsonImportSubview extends Component { constructor (props) { diff --git a/ui/app/components/pages/create-account/import-account/private-key.js b/ui/app/pages/create-account/import-account/private-key.js similarity index 93% rename from ui/app/components/pages/create-account/import-account/private-key.js rename to ui/app/pages/create-account/import-account/private-key.js index 4ba31806f3df..450614e87ddd 100644 --- a/ui/app/components/pages/create-account/import-account/private-key.js +++ b/ui/app/pages/create-account/import-account/private-key.js @@ -5,10 +5,10 @@ const { withRouter } = require('react-router-dom') const { compose } = require('recompose') const PropTypes = require('prop-types') const connect = require('react-redux').connect -const actions = require('../../../../actions') -const { DEFAULT_ROUTE } = require('../../../../routes') -const { getMetaMaskAccounts } = require('../../../../selectors') -import Button from '../../../button' +const actions = require('../../../store/actions') +const { DEFAULT_ROUTE } = require('../../../helpers/constants/routes') +const { getMetaMaskAccounts } = require('../../../selectors/selectors') +import Button from '../../../components/ui/button' PrivateKeyImportView.contextTypes = { t: PropTypes.func, diff --git a/ui/app/components/pages/create-account/import-account/seed.js b/ui/app/pages/create-account/import-account/seed.js similarity index 100% rename from ui/app/components/pages/create-account/import-account/seed.js rename to ui/app/pages/create-account/import-account/seed.js diff --git a/ui/app/components/pages/create-account/index.js b/ui/app/pages/create-account/index.js similarity index 95% rename from ui/app/components/pages/create-account/index.js rename to ui/app/pages/create-account/index.js index d3de1ea0118e..ce84db028a40 100644 --- a/ui/app/components/pages/create-account/index.js +++ b/ui/app/pages/create-account/index.js @@ -3,8 +3,8 @@ const { Switch, Route, matchPath } = require('react-router-dom') const PropTypes = require('prop-types') const h = require('react-hyperscript') const connect = require('react-redux').connect -const actions = require('../../../actions') -const { getCurrentViewContext } = require('../../../selectors') +const actions = require('../../store/actions') +const { getCurrentViewContext } = require('../../selectors/selectors') const classnames = require('classnames') const NewAccountCreateForm = require('./new-account') const NewAccountImportForm = require('./import-account') @@ -13,7 +13,7 @@ const { NEW_ACCOUNT_ROUTE, IMPORT_ACCOUNT_ROUTE, CONNECT_HARDWARE_ROUTE, -} = require('../../../routes') +} = require('../../helpers/constants/routes') class CreateAccountPage extends Component { renderTabs () { diff --git a/ui/app/components/pages/create-account/new-account.js b/ui/app/pages/create-account/new-account.js similarity index 95% rename from ui/app/components/pages/create-account/new-account.js rename to ui/app/pages/create-account/new-account.js index a7595e3468ca..316fbe6f156f 100644 --- a/ui/app/components/pages/create-account/new-account.js +++ b/ui/app/pages/create-account/new-account.js @@ -2,9 +2,9 @@ const { Component } = require('react') const PropTypes = require('prop-types') const h = require('react-hyperscript') const connect = require('react-redux').connect -const actions = require('../../../actions') -const { DEFAULT_ROUTE } = require('../../../routes') -import Button from '../../button' +const actions = require('../../store/actions') +const { DEFAULT_ROUTE } = require('../../helpers/constants/routes') +import Button from '../../components/ui/button' class NewAccountCreateForm extends Component { constructor (props, context) { diff --git a/ui/app/components/pages/first-time-flow/create-password/create-password.component.js b/ui/app/pages/first-time-flow/create-password/create-password.component.js similarity index 93% rename from ui/app/components/pages/first-time-flow/create-password/create-password.component.js rename to ui/app/pages/first-time-flow/create-password/create-password.component.js index 3faaa376414b..5e67a2244460 100644 --- a/ui/app/components/pages/first-time-flow/create-password/create-password.component.js +++ b/ui/app/pages/first-time-flow/create-password/create-password.component.js @@ -6,8 +6,8 @@ import ImportWithSeedPhrase from './import-with-seed-phrase' import { INITIALIZE_CREATE_PASSWORD_ROUTE, INITIALIZE_IMPORT_WITH_SEED_PHRASE_ROUTE, - INITIALIZE_END_OF_FLOW_ROUTE, -} from '../../../../routes' + INITIALIZE_SEED_PHRASE_ROUTE, +} from '../../../helpers/constants/routes' export default class CreatePassword extends PureComponent { static propTypes = { @@ -21,7 +21,7 @@ export default class CreatePassword extends PureComponent { const { isInitialized, history } = this.props if (isInitialized) { - history.push(INITIALIZE_END_OF_FLOW_ROUTE) + history.push(INITIALIZE_SEED_PHRASE_ROUTE) } } diff --git a/ui/app/components/pages/first-time-flow/create-password/create-password.container.js b/ui/app/pages/first-time-flow/create-password/create-password.container.js similarity index 100% rename from ui/app/components/pages/first-time-flow/create-password/create-password.container.js rename to ui/app/pages/first-time-flow/create-password/create-password.container.js diff --git a/ui/app/components/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js b/ui/app/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js similarity index 96% rename from ui/app/components/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js rename to ui/app/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js index 6b3c03bb3122..433dad6e2aa7 100644 --- a/ui/app/components/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js +++ b/ui/app/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js @@ -1,12 +1,12 @@ import {validateMnemonic} from 'bip39' import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import TextField from '../../../../text-field' -import Button from '../../../../button' +import TextField from '../../../../components/ui/text-field' +import Button from '../../../../components/ui/button' import { INITIALIZE_SELECT_ACTION_ROUTE, INITIALIZE_END_OF_FLOW_ROUTE, -} from '../../../../../routes' +} from '../../../../helpers/constants/routes' export default class ImportWithSeedPhrase extends PureComponent { static contextTypes = { @@ -104,7 +104,7 @@ export default class ImportWithSeedPhrase extends PureComponent { const { history, onSubmit } = this.props try { - await onSubmit(password, seedPhrase) + await onSubmit(password, this.parseSeedPhrase(seedPhrase)) this.context.metricsEvent({ eventOpts: { category: 'Onboarding', diff --git a/ui/app/components/pages/first-time-flow/create-password/import-with-seed-phrase/index.js b/ui/app/pages/first-time-flow/create-password/import-with-seed-phrase/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/create-password/import-with-seed-phrase/index.js rename to ui/app/pages/first-time-flow/create-password/import-with-seed-phrase/index.js diff --git a/ui/app/components/pages/first-time-flow/create-password/index.js b/ui/app/pages/first-time-flow/create-password/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/create-password/index.js rename to ui/app/pages/first-time-flow/create-password/index.js diff --git a/ui/app/components/pages/first-time-flow/create-password/new-account/index.js b/ui/app/pages/first-time-flow/create-password/new-account/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/create-password/new-account/index.js rename to ui/app/pages/first-time-flow/create-password/new-account/index.js diff --git a/ui/app/components/pages/first-time-flow/create-password/new-account/new-account.component.js b/ui/app/pages/first-time-flow/create-password/new-account/new-account.component.js similarity index 97% rename from ui/app/components/pages/first-time-flow/create-password/new-account/new-account.component.js rename to ui/app/pages/first-time-flow/create-password/new-account/new-account.component.js index 11d10e2d9363..c040cff88af5 100644 --- a/ui/app/components/pages/first-time-flow/create-password/new-account/new-account.component.js +++ b/ui/app/pages/first-time-flow/create-password/new-account/new-account.component.js @@ -1,12 +1,12 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import Button from '../../../../button' +import Button from '../../../../components/ui/button' import { INITIALIZE_SEED_PHRASE_ROUTE, INITIALIZE_IMPORT_WITH_SEED_PHRASE_ROUTE, INITIALIZE_SELECT_ACTION_ROUTE, -} from '../../../../../routes' -import TextField from '../../../../text-field' +} from '../../../../helpers/constants/routes' +import TextField from '../../../../components/ui/text-field' export default class NewAccount extends PureComponent { static contextTypes = { diff --git a/ui/app/components/pages/first-time-flow/create-password/unique-image/index.js b/ui/app/pages/first-time-flow/create-password/unique-image/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/create-password/unique-image/index.js rename to ui/app/pages/first-time-flow/create-password/unique-image/index.js diff --git a/ui/app/components/pages/first-time-flow/create-password/unique-image/unique-image.component.js b/ui/app/pages/first-time-flow/create-password/unique-image/unique-image.component.js similarity index 90% rename from ui/app/components/pages/first-time-flow/create-password/unique-image/unique-image.component.js rename to ui/app/pages/first-time-flow/create-password/unique-image/unique-image.component.js index cbc85c0e47cb..3434d117a8bc 100644 --- a/ui/app/components/pages/first-time-flow/create-password/unique-image/unique-image.component.js +++ b/ui/app/pages/first-time-flow/create-password/unique-image/unique-image.component.js @@ -1,7 +1,7 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import Button from '../../../../button' -import { INITIALIZE_END_OF_FLOW_ROUTE } from '../../../../../routes' +import Button from '../../../../components/ui/button' +import { INITIALIZE_END_OF_FLOW_ROUTE } from '../../../../helpers/constants/routes' export default class UniqueImageScreen extends PureComponent { static contextTypes = { diff --git a/ui/app/components/pages/first-time-flow/create-password/unique-image/unique-image.container.js b/ui/app/pages/first-time-flow/create-password/unique-image/unique-image.container.js similarity index 100% rename from ui/app/components/pages/first-time-flow/create-password/unique-image/unique-image.container.js rename to ui/app/pages/first-time-flow/create-password/unique-image/unique-image.container.js diff --git a/ui/app/components/pages/first-time-flow/end-of-flow/end-of-flow.component.js b/ui/app/pages/first-time-flow/end-of-flow/end-of-flow.component.js similarity index 96% rename from ui/app/components/pages/first-time-flow/end-of-flow/end-of-flow.component.js rename to ui/app/pages/first-time-flow/end-of-flow/end-of-flow.component.js index c0e2f59d9952..c4292331bed2 100644 --- a/ui/app/components/pages/first-time-flow/end-of-flow/end-of-flow.component.js +++ b/ui/app/pages/first-time-flow/end-of-flow/end-of-flow.component.js @@ -1,7 +1,7 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import Button from '../../../button' -import { DEFAULT_ROUTE } from '../../../../routes' +import Button from '../../../components/ui/button' +import { DEFAULT_ROUTE } from '../../../helpers/constants/routes' export default class EndOfFlowScreen extends PureComponent { static contextTypes = { diff --git a/ui/app/components/pages/first-time-flow/end-of-flow/end-of-flow.container.js b/ui/app/pages/first-time-flow/end-of-flow/end-of-flow.container.js similarity index 89% rename from ui/app/components/pages/first-time-flow/end-of-flow/end-of-flow.container.js rename to ui/app/pages/first-time-flow/end-of-flow/end-of-flow.container.js index 91ae5a941d95..38313806c48d 100644 --- a/ui/app/components/pages/first-time-flow/end-of-flow/end-of-flow.container.js +++ b/ui/app/pages/first-time-flow/end-of-flow/end-of-flow.container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import EndOfFlow from './end-of-flow.component' -import { setCompletedOnboarding } from '../../../../actions' +import { setCompletedOnboarding } from '../../../store/actions' const firstTimeFlowTypeNameMap = { create: 'New Wallet Created', diff --git a/ui/app/components/pages/first-time-flow/end-of-flow/index.js b/ui/app/pages/first-time-flow/end-of-flow/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/end-of-flow/index.js rename to ui/app/pages/first-time-flow/end-of-flow/index.js diff --git a/ui/app/components/pages/first-time-flow/end-of-flow/index.scss b/ui/app/pages/first-time-flow/end-of-flow/index.scss similarity index 100% rename from ui/app/components/pages/first-time-flow/end-of-flow/index.scss rename to ui/app/pages/first-time-flow/end-of-flow/index.scss diff --git a/ui/app/components/pages/first-time-flow/first-time-flow-switch/first-time-flow-switch.component.js b/ui/app/pages/first-time-flow/first-time-flow-switch/first-time-flow-switch.component.js similarity index 97% rename from ui/app/components/pages/first-time-flow/first-time-flow-switch/first-time-flow-switch.component.js rename to ui/app/pages/first-time-flow/first-time-flow-switch/first-time-flow-switch.component.js index 5c2294393061..4fd028482f9f 100644 --- a/ui/app/components/pages/first-time-flow/first-time-flow-switch/first-time-flow-switch.component.js +++ b/ui/app/pages/first-time-flow/first-time-flow-switch/first-time-flow-switch.component.js @@ -8,7 +8,7 @@ import { INITIALIZE_UNLOCK_ROUTE, INITIALIZE_SEED_PHRASE_ROUTE, INITIALIZE_METAMETRICS_OPT_IN_ROUTE, -} from '../../../../routes' +} from '../../../helpers/constants/routes' export default class FirstTimeFlowSwitch extends PureComponent { static propTypes = { diff --git a/ui/app/components/pages/first-time-flow/first-time-flow-switch/first-time-flow-switch.container.js b/ui/app/pages/first-time-flow/first-time-flow-switch/first-time-flow-switch.container.js similarity index 100% rename from ui/app/components/pages/first-time-flow/first-time-flow-switch/first-time-flow-switch.container.js rename to ui/app/pages/first-time-flow/first-time-flow-switch/first-time-flow-switch.container.js diff --git a/ui/app/components/pages/first-time-flow/first-time-flow-switch/index.js b/ui/app/pages/first-time-flow/first-time-flow-switch/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/first-time-flow-switch/index.js rename to ui/app/pages/first-time-flow/first-time-flow-switch/index.js diff --git a/ui/app/components/pages/first-time-flow/first-time-flow.component.js b/ui/app/pages/first-time-flow/first-time-flow.component.js similarity index 99% rename from ui/app/components/pages/first-time-flow/first-time-flow.component.js rename to ui/app/pages/first-time-flow/first-time-flow.component.js index a1f629431257..bf6e80ca94c9 100644 --- a/ui/app/components/pages/first-time-flow/first-time-flow.component.js +++ b/ui/app/pages/first-time-flow/first-time-flow.component.js @@ -18,7 +18,7 @@ import { INITIALIZE_SELECT_ACTION_ROUTE, INITIALIZE_END_OF_FLOW_ROUTE, INITIALIZE_METAMETRICS_OPT_IN_ROUTE, -} from '../../../routes' +} from '../../helpers/constants/routes' export default class FirstTimeFlow extends PureComponent { static propTypes = { diff --git a/ui/app/components/pages/first-time-flow/first-time-flow.container.js b/ui/app/pages/first-time-flow/first-time-flow.container.js similarity index 97% rename from ui/app/components/pages/first-time-flow/first-time-flow.container.js rename to ui/app/pages/first-time-flow/first-time-flow.container.js index 293f94c47c1f..16025a489778 100644 --- a/ui/app/components/pages/first-time-flow/first-time-flow.container.js +++ b/ui/app/pages/first-time-flow/first-time-flow.container.js @@ -5,7 +5,7 @@ import { createNewVaultAndGetSeedPhrase, createNewVaultAndRestore, unlockAndGetSeedPhrase, -} from '../../../actions' +} from '../../store/actions' const mapStateToProps = state => { const { metamask: { completedOnboarding, isInitialized, isUnlocked } } = state diff --git a/ui/app/components/pages/first-time-flow/first-time-flow.selectors.js b/ui/app/pages/first-time-flow/first-time-flow.selectors.js similarity index 93% rename from ui/app/components/pages/first-time-flow/first-time-flow.selectors.js rename to ui/app/pages/first-time-flow/first-time-flow.selectors.js index 1286afed9f34..e6cd5a84ac3b 100644 --- a/ui/app/components/pages/first-time-flow/first-time-flow.selectors.js +++ b/ui/app/pages/first-time-flow/first-time-flow.selectors.js @@ -2,7 +2,7 @@ import { INITIALIZE_CREATE_PASSWORD_ROUTE, INITIALIZE_IMPORT_WITH_SEED_PHRASE_ROUTE, DEFAULT_ROUTE, -} from '../../../routes' +} from '../../helpers/constants/routes' const selectors = { getFirstTimeFlowTypeRoute, diff --git a/ui/app/components/pages/first-time-flow/index.js b/ui/app/pages/first-time-flow/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/index.js rename to ui/app/pages/first-time-flow/index.js diff --git a/ui/app/components/pages/first-time-flow/index.scss b/ui/app/pages/first-time-flow/index.scss similarity index 93% rename from ui/app/components/pages/first-time-flow/index.scss rename to ui/app/pages/first-time-flow/index.scss index d4174857524b..6c65cfdae897 100644 --- a/ui/app/components/pages/first-time-flow/index.scss +++ b/ui/app/pages/first-time-flow/index.scss @@ -1,12 +1,12 @@ -@import './welcome/index'; +@import 'welcome/index'; -@import './select-action/index'; +@import 'select-action/index'; -@import './seed-phrase/index'; +@import 'seed-phrase/index'; -@import './end-of-flow/index'; +@import 'end-of-flow/index'; -@import './metametrics-opt-in/index'; +@import 'metametrics-opt-in/index'; .first-time-flow { diff --git a/ui/app/components/pages/first-time-flow/metametrics-opt-in/index.js b/ui/app/pages/first-time-flow/metametrics-opt-in/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/metametrics-opt-in/index.js rename to ui/app/pages/first-time-flow/metametrics-opt-in/index.js diff --git a/ui/app/components/pages/first-time-flow/metametrics-opt-in/index.scss b/ui/app/pages/first-time-flow/metametrics-opt-in/index.scss similarity index 100% rename from ui/app/components/pages/first-time-flow/metametrics-opt-in/index.scss rename to ui/app/pages/first-time-flow/metametrics-opt-in/index.scss diff --git a/ui/app/components/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.component.js b/ui/app/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.component.js similarity index 97% rename from ui/app/components/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.component.js rename to ui/app/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.component.js index 58a03944e47e..19c668278a14 100644 --- a/ui/app/components/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.component.js +++ b/ui/app/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.component.js @@ -1,6 +1,6 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import PageContainerFooter from '../../../page-container/page-container-footer' +import PageContainerFooter from '../../../components/ui/page-container/page-container-footer' export default class MetaMetricsOptIn extends Component { static propTypes = { @@ -48,7 +48,7 @@ export default class MetaMetricsOptIn extends Component {

MetaMask would like to gather usage data to better understand how our users interact with the extension. This data - will be used to continually improve the usability and user experience of our product and the Etheruem ecosystem. + will be used to continually improve the usability and user experience of our product and the Ethereum ecosystem.
MetaMask will.. diff --git a/ui/app/components/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.container.js b/ui/app/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.container.js similarity index 92% rename from ui/app/components/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.container.js rename to ui/app/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.container.js index b13af8bf6a95..2566a2a56cb5 100644 --- a/ui/app/components/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.container.js +++ b/ui/app/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import MetaMetricsOptIn from './metametrics-opt-in.component' -import { setParticipateInMetaMetrics } from '../../../../actions' +import { setParticipateInMetaMetrics } from '../../../store/actions' import { getFirstTimeFlowTypeRoute } from '../first-time-flow.selectors' const firstTimeFlowTypeNameMap = { diff --git a/ui/app/components/pages/first-time-flow/seed-phrase/confirm-seed-phrase/confirm-seed-phrase.component.js b/ui/app/pages/first-time-flow/seed-phrase/confirm-seed-phrase/confirm-seed-phrase.component.js similarity index 96% rename from ui/app/components/pages/first-time-flow/seed-phrase/confirm-seed-phrase/confirm-seed-phrase.component.js rename to ui/app/pages/first-time-flow/seed-phrase/confirm-seed-phrase/confirm-seed-phrase.component.js index bd5ab8a84037..59b4f73a6431 100644 --- a/ui/app/components/pages/first-time-flow/seed-phrase/confirm-seed-phrase/confirm-seed-phrase.component.js +++ b/ui/app/pages/first-time-flow/seed-phrase/confirm-seed-phrase/confirm-seed-phrase.component.js @@ -2,12 +2,12 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' import shuffle from 'lodash.shuffle' -import Button from '../../../../button' +import Button from '../../../../components/ui/button' import { INITIALIZE_END_OF_FLOW_ROUTE, INITIALIZE_SEED_PHRASE_ROUTE, -} from '../../../../../routes' -import { exportAsFile } from '../../../../../../app/util' +} from '../../../../helpers/constants/routes' +import { exportAsFile } from '../../../../helpers/utils/util' import { selectSeedWord, deselectSeedWord } from './confirm-seed-phrase.state' export default class ConfirmSeedPhrase extends PureComponent { diff --git a/ui/app/components/pages/first-time-flow/seed-phrase/confirm-seed-phrase/confirm-seed-phrase.state.js b/ui/app/pages/first-time-flow/seed-phrase/confirm-seed-phrase/confirm-seed-phrase.state.js similarity index 100% rename from ui/app/components/pages/first-time-flow/seed-phrase/confirm-seed-phrase/confirm-seed-phrase.state.js rename to ui/app/pages/first-time-flow/seed-phrase/confirm-seed-phrase/confirm-seed-phrase.state.js diff --git a/ui/app/components/pages/first-time-flow/seed-phrase/confirm-seed-phrase/index.js b/ui/app/pages/first-time-flow/seed-phrase/confirm-seed-phrase/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/seed-phrase/confirm-seed-phrase/index.js rename to ui/app/pages/first-time-flow/seed-phrase/confirm-seed-phrase/index.js diff --git a/ui/app/components/pages/first-time-flow/seed-phrase/confirm-seed-phrase/index.scss b/ui/app/pages/first-time-flow/seed-phrase/confirm-seed-phrase/index.scss similarity index 100% rename from ui/app/components/pages/first-time-flow/seed-phrase/confirm-seed-phrase/index.scss rename to ui/app/pages/first-time-flow/seed-phrase/confirm-seed-phrase/index.scss diff --git a/ui/app/components/pages/first-time-flow/seed-phrase/index.js b/ui/app/pages/first-time-flow/seed-phrase/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/seed-phrase/index.js rename to ui/app/pages/first-time-flow/seed-phrase/index.js diff --git a/ui/app/components/pages/first-time-flow/seed-phrase/index.scss b/ui/app/pages/first-time-flow/seed-phrase/index.scss similarity index 87% rename from ui/app/components/pages/first-time-flow/seed-phrase/index.scss rename to ui/app/pages/first-time-flow/seed-phrase/index.scss index e4fd7be4fc12..24da45ded6e0 100644 --- a/ui/app/components/pages/first-time-flow/seed-phrase/index.scss +++ b/ui/app/pages/first-time-flow/seed-phrase/index.scss @@ -1,6 +1,6 @@ -@import './confirm-seed-phrase/index'; +@import 'confirm-seed-phrase/index'; -@import './reveal-seed-phrase/index'; +@import 'reveal-seed-phrase/index'; .seed-phrase { diff --git a/ui/app/components/pages/first-time-flow/seed-phrase/reveal-seed-phrase/index.js b/ui/app/pages/first-time-flow/seed-phrase/reveal-seed-phrase/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/seed-phrase/reveal-seed-phrase/index.js rename to ui/app/pages/first-time-flow/seed-phrase/reveal-seed-phrase/index.js diff --git a/ui/app/components/pages/first-time-flow/seed-phrase/reveal-seed-phrase/index.scss b/ui/app/pages/first-time-flow/seed-phrase/reveal-seed-phrase/index.scss similarity index 100% rename from ui/app/components/pages/first-time-flow/seed-phrase/reveal-seed-phrase/index.scss rename to ui/app/pages/first-time-flow/seed-phrase/reveal-seed-phrase/index.scss diff --git a/ui/app/components/pages/first-time-flow/seed-phrase/reveal-seed-phrase/reveal-seed-phrase.component.js b/ui/app/pages/first-time-flow/seed-phrase/reveal-seed-phrase/reveal-seed-phrase.component.js similarity index 95% rename from ui/app/components/pages/first-time-flow/seed-phrase/reveal-seed-phrase/reveal-seed-phrase.component.js rename to ui/app/pages/first-time-flow/seed-phrase/reveal-seed-phrase/reveal-seed-phrase.component.js index cb8a01322fbf..ee352d74e3df 100644 --- a/ui/app/components/pages/first-time-flow/seed-phrase/reveal-seed-phrase/reveal-seed-phrase.component.js +++ b/ui/app/pages/first-time-flow/seed-phrase/reveal-seed-phrase/reveal-seed-phrase.component.js @@ -1,10 +1,10 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import LockIcon from '../../../../lock-icon' -import Button from '../../../../button' -import { INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE } from '../../../../../routes' -import { exportAsFile } from '../../../../../../app/util' +import LockIcon from '../../../../components/ui/lock-icon' +import Button from '../../../../components/ui/button' +import { INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE } from '../../../../helpers/constants/routes' +import { exportAsFile } from '../../../../helpers/utils/util' export default class RevealSeedPhrase extends PureComponent { static contextTypes = { diff --git a/ui/app/components/pages/first-time-flow/seed-phrase/seed-phrase.component.js b/ui/app/pages/first-time-flow/seed-phrase/seed-phrase.component.js similarity index 97% rename from ui/app/components/pages/first-time-flow/seed-phrase/seed-phrase.component.js rename to ui/app/pages/first-time-flow/seed-phrase/seed-phrase.component.js index 9eec89cddb71..9a9f84049fcb 100644 --- a/ui/app/components/pages/first-time-flow/seed-phrase/seed-phrase.component.js +++ b/ui/app/pages/first-time-flow/seed-phrase/seed-phrase.component.js @@ -7,7 +7,7 @@ import { INITIALIZE_SEED_PHRASE_ROUTE, INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE, DEFAULT_ROUTE, -} from '../../../../routes' +} from '../../../helpers/constants/routes' export default class SeedPhrase extends PureComponent { static propTypes = { diff --git a/ui/app/components/pages/first-time-flow/select-action/index.js b/ui/app/pages/first-time-flow/select-action/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/select-action/index.js rename to ui/app/pages/first-time-flow/select-action/index.js diff --git a/ui/app/components/pages/first-time-flow/select-action/index.scss b/ui/app/pages/first-time-flow/select-action/index.scss similarity index 100% rename from ui/app/components/pages/first-time-flow/select-action/index.scss rename to ui/app/pages/first-time-flow/select-action/index.scss diff --git a/ui/app/components/pages/first-time-flow/select-action/select-action.component.js b/ui/app/pages/first-time-flow/select-action/select-action.component.js similarity index 97% rename from ui/app/components/pages/first-time-flow/select-action/select-action.component.js rename to ui/app/pages/first-time-flow/select-action/select-action.component.js index b6a6942c315a..b25a15514ee2 100644 --- a/ui/app/components/pages/first-time-flow/select-action/select-action.component.js +++ b/ui/app/pages/first-time-flow/select-action/select-action.component.js @@ -1,9 +1,9 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import Button from '../../../button' +import Button from '../../../components/ui/button' import { INITIALIZE_METAMETRICS_OPT_IN_ROUTE, -} from '../../../../routes' +} from '../../../helpers/constants/routes' export default class SelectAction extends PureComponent { static propTypes = { diff --git a/ui/app/components/pages/first-time-flow/select-action/select-action.container.js b/ui/app/pages/first-time-flow/select-action/select-action.container.js similarity index 90% rename from ui/app/components/pages/first-time-flow/select-action/select-action.container.js rename to ui/app/pages/first-time-flow/select-action/select-action.container.js index 42fac7af27b2..9dc988430353 100644 --- a/ui/app/components/pages/first-time-flow/select-action/select-action.container.js +++ b/ui/app/pages/first-time-flow/select-action/select-action.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import { withRouter } from 'react-router-dom' import { compose } from 'recompose' -import { setFirstTimeFlowType } from '../../../../actions' +import { setFirstTimeFlowType } from '../../../store/actions' import { getFirstTimeFlowTypeRoute } from '../first-time-flow.selectors' import Welcome from './select-action.component' diff --git a/ui/app/components/pages/first-time-flow/welcome/index.js b/ui/app/pages/first-time-flow/welcome/index.js similarity index 100% rename from ui/app/components/pages/first-time-flow/welcome/index.js rename to ui/app/pages/first-time-flow/welcome/index.js diff --git a/ui/app/components/pages/first-time-flow/welcome/index.scss b/ui/app/pages/first-time-flow/welcome/index.scss similarity index 100% rename from ui/app/components/pages/first-time-flow/welcome/index.scss rename to ui/app/pages/first-time-flow/welcome/index.scss diff --git a/ui/app/components/pages/first-time-flow/welcome/welcome.component.js b/ui/app/pages/first-time-flow/welcome/welcome.component.js similarity index 91% rename from ui/app/components/pages/first-time-flow/welcome/welcome.component.js rename to ui/app/pages/first-time-flow/welcome/welcome.component.js index 88cdb936c02f..3b8d6eb1782f 100644 --- a/ui/app/components/pages/first-time-flow/welcome/welcome.component.js +++ b/ui/app/pages/first-time-flow/welcome/welcome.component.js @@ -1,9 +1,9 @@ import EventEmitter from 'events' import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import Mascot from '../../../mascot' -import Button from '../../../button' -import { INITIALIZE_CREATE_PASSWORD_ROUTE, INITIALIZE_SELECT_ACTION_ROUTE } from '../../../../routes' +import Mascot from '../../../components/ui/mascot' +import Button from '../../../components/ui/button' +import { INITIALIZE_CREATE_PASSWORD_ROUTE, INITIALIZE_SELECT_ACTION_ROUTE } from '../../../helpers/constants/routes' export default class Welcome extends PureComponent { static propTypes = { diff --git a/ui/app/components/pages/first-time-flow/welcome/welcome.container.js b/ui/app/pages/first-time-flow/welcome/welcome.container.js similarity index 90% rename from ui/app/components/pages/first-time-flow/welcome/welcome.container.js rename to ui/app/pages/first-time-flow/welcome/welcome.container.js index 47753e16f5cd..ce4b2b4715c5 100644 --- a/ui/app/components/pages/first-time-flow/welcome/welcome.container.js +++ b/ui/app/pages/first-time-flow/welcome/welcome.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import { withRouter } from 'react-router-dom' import { compose } from 'recompose' -import { closeWelcomeScreen } from '../../../../actions' +import { closeWelcomeScreen } from '../../../store/actions' import Welcome from './welcome.component' const mapStateToProps = ({ metamask }) => { diff --git a/ui/app/components/pages/home/home.component.js b/ui/app/pages/home/home.component.js similarity index 91% rename from ui/app/components/pages/home/home.component.js rename to ui/app/pages/home/home.component.js index 953d43aba221..29d93a9fa2ff 100644 --- a/ui/app/components/pages/home/home.component.js +++ b/ui/app/pages/home/home.component.js @@ -2,8 +2,8 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import Media from 'react-media' import { Redirect } from 'react-router-dom' -import WalletView from '../../wallet-view' -import TransactionView from '../../transaction-view' +import WalletView from '../../components/app/wallet-view' +import TransactionView from '../../components/app/transaction-view' import ProviderApproval from '../provider-approval' import { @@ -11,7 +11,7 @@ import { RESTORE_VAULT_ROUTE, CONFIRM_TRANSACTION_ROUTE, CONFIRM_ADD_SUGGESTED_TOKEN_ROUTE, -} from '../../../routes' +} from '../../helpers/constants/routes' export default class Home extends PureComponent { static propTypes = { diff --git a/ui/app/components/pages/home/home.container.js b/ui/app/pages/home/home.container.js similarity index 87% rename from ui/app/components/pages/home/home.container.js rename to ui/app/pages/home/home.container.js index bb8cf5e81324..02ec4b9c65e2 100644 --- a/ui/app/components/pages/home/home.container.js +++ b/ui/app/pages/home/home.container.js @@ -2,7 +2,7 @@ import Home from './home.component' import { compose } from 'recompose' import { connect } from 'react-redux' import { withRouter } from 'react-router-dom' -import { unconfirmedTransactionsCountSelector } from '../../../selectors/confirm-transaction' +import { unconfirmedTransactionsCountSelector } from '../../selectors/confirm-transaction' const mapStateToProps = state => { const { metamask, appState } = state diff --git a/ui/app/components/pages/home/index.js b/ui/app/pages/home/index.js similarity index 100% rename from ui/app/components/pages/home/index.js rename to ui/app/pages/home/index.js diff --git a/ui/app/pages/index.js b/ui/app/pages/index.js new file mode 100644 index 000000000000..56fc4af04d6a --- /dev/null +++ b/ui/app/pages/index.js @@ -0,0 +1,31 @@ +import React, { Component } from 'react' +const PropTypes = require('prop-types') +const { Provider } = require('react-redux') +const { HashRouter } = require('react-router-dom') +const Routes = require('./routes') +const I18nProvider = require('../helpers/higher-order-components/i18n-provider') +const MetaMetricsProvider = require('../helpers/higher-order-components/metametrics/metametrics.provider') + +class Index extends Component { + render () { + const { store } = this.props + + return ( + + + + + + + + + + ) + } +} + +Index.propTypes = { + store: PropTypes.object, +} + +module.exports = Index diff --git a/ui/app/pages/index.scss b/ui/app/pages/index.scss new file mode 100644 index 000000000000..cb9f0d80cd31 --- /dev/null +++ b/ui/app/pages/index.scss @@ -0,0 +1,11 @@ +@import 'unlock-page/index'; + +@import 'add-token/index'; + +@import 'confirm-add-token/index'; + +@import 'settings/index'; + +@import 'first-time-flow/index'; + +@import 'keychains/index'; diff --git a/ui/app/components/pages/keychains/index.scss b/ui/app/pages/keychains/index.scss similarity index 100% rename from ui/app/components/pages/keychains/index.scss rename to ui/app/pages/keychains/index.scss diff --git a/ui/app/components/pages/keychains/restore-vault.js b/ui/app/pages/keychains/restore-vault.js similarity index 96% rename from ui/app/components/pages/keychains/restore-vault.js rename to ui/app/pages/keychains/restore-vault.js index 73ff5191a295..574949258387 100644 --- a/ui/app/components/pages/keychains/restore-vault.js +++ b/ui/app/pages/keychains/restore-vault.js @@ -4,10 +4,10 @@ import {connect} from 'react-redux' import { createNewVaultAndRestore, unMarkPasswordForgotten, -} from '../../../actions' -import { DEFAULT_ROUTE } from '../../../routes' -import TextField from '../../text-field' -import Button from '../../button' +} from '../../store/actions' +import { DEFAULT_ROUTE } from '../../helpers/constants/routes' +import TextField from '../../components/ui/text-field' +import Button from '../../components/ui/button' class RestoreVaultPage extends Component { static contextTypes = { diff --git a/ui/app/components/pages/keychains/reveal-seed.js b/ui/app/pages/keychains/reveal-seed.js similarity index 94% rename from ui/app/components/pages/keychains/reveal-seed.js rename to ui/app/pages/keychains/reveal-seed.js index 32557066ff2e..edc9db5a08fe 100644 --- a/ui/app/components/pages/keychains/reveal-seed.js +++ b/ui/app/pages/keychains/reveal-seed.js @@ -4,11 +4,11 @@ const PropTypes = require('prop-types') const h = require('react-hyperscript') const classnames = require('classnames') -const { requestRevealSeedWords } = require('../../../actions') -const { DEFAULT_ROUTE } = require('../../../routes') -const ExportTextContainer = require('../../export-text-container') +const { requestRevealSeedWords } = require('../../store/actions') +const { DEFAULT_ROUTE } = require('../../helpers/constants/routes') +const ExportTextContainer = require('../../components/ui/export-text-container') -import Button from '../../button' +import Button from '../../components/ui/button' const PASSWORD_PROMPT_SCREEN = 'PASSWORD_PROMPT_SCREEN' const REVEAL_SEED_SCREEN = 'REVEAL_SEED_SCREEN' diff --git a/ui/app/components/pages/lock/index.js b/ui/app/pages/lock/index.js similarity index 100% rename from ui/app/components/pages/lock/index.js rename to ui/app/pages/lock/index.js diff --git a/ui/app/components/pages/lock/lock.component.js b/ui/app/pages/lock/lock.component.js similarity index 81% rename from ui/app/components/pages/lock/lock.component.js rename to ui/app/pages/lock/lock.component.js index 51f8742edf64..1145158c5460 100644 --- a/ui/app/components/pages/lock/lock.component.js +++ b/ui/app/pages/lock/lock.component.js @@ -1,7 +1,7 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import Loading from '../../loading-screen' -import { DEFAULT_ROUTE } from '../../../routes' +import Loading from '../../components/ui/loading-screen' +import { DEFAULT_ROUTE } from '../../helpers/constants/routes' export default class Lock extends PureComponent { static propTypes = { diff --git a/ui/app/components/pages/lock/lock.container.js b/ui/app/pages/lock/lock.container.js similarity index 90% rename from ui/app/components/pages/lock/lock.container.js rename to ui/app/pages/lock/lock.container.js index 81d89ba21a4d..6a20b6ed18c9 100644 --- a/ui/app/components/pages/lock/lock.container.js +++ b/ui/app/pages/lock/lock.container.js @@ -2,7 +2,7 @@ import Lock from './lock.component' import { compose } from 'recompose' import { connect } from 'react-redux' import { withRouter } from 'react-router-dom' -import { lockMetamask } from '../../../actions' +import { lockMetamask } from '../../store/actions' const mapStateToProps = state => { const { metamask: { isUnlocked } } = state diff --git a/ui/app/components/pages/mobile-sync/index.js b/ui/app/pages/mobile-sync/index.js similarity index 97% rename from ui/app/components/pages/mobile-sync/index.js rename to ui/app/pages/mobile-sync/index.js index 22a69d092343..0938ad103107 100644 --- a/ui/app/components/pages/mobile-sync/index.js +++ b/ui/app/pages/mobile-sync/index.js @@ -5,14 +5,14 @@ const h = require('react-hyperscript') const classnames = require('classnames') const PubNub = require('pubnub') -const { requestRevealSeedWords, fetchInfoToSync } = require('../../../actions') -const { DEFAULT_ROUTE } = require('../../../routes') -const actions = require('../../../actions') +const { requestRevealSeedWords, fetchInfoToSync } = require('../../store/actions') +const { DEFAULT_ROUTE } = require('../../helpers/constants/routes') +const actions = require('../../store/actions') const qrCode = require('qrcode-generator') -import Button from '../../button' -import LoadingScreen from '../../loading-screen' +import Button from '../../components/ui/button' +import LoadingScreen from '../../components/ui/loading-screen' const PASSWORD_PROMPT_SCREEN = 'PASSWORD_PROMPT_SCREEN' const REVEAL_SEED_SCREEN = 'REVEAL_SEED_SCREEN' diff --git a/ui/app/components/pages/notice.js b/ui/app/pages/notice/notice.js similarity index 97% rename from ui/app/components/pages/notice.js rename to ui/app/pages/notice/notice.js index a9077b98be32..d8274dfcb55f 100644 --- a/ui/app/components/pages/notice.js +++ b/ui/app/pages/notice/notice.js @@ -6,8 +6,8 @@ const ReactMarkdown = require('react-markdown') const linker = require('extension-link-enabler') const generateLostAccountsNotice = require('../../../lib/lost-accounts-notice') const findDOMNode = require('react-dom').findDOMNode -const actions = require('../../actions') -const { DEFAULT_ROUTE } = require('../../routes') +const actions = require('../../store/actions') +const { DEFAULT_ROUTE } = require('../../helpers/constants/routes') class Notice extends Component { constructor (props) { diff --git a/ui/app/components/pages/provider-approval/index.js b/ui/app/pages/provider-approval/index.js similarity index 100% rename from ui/app/components/pages/provider-approval/index.js rename to ui/app/pages/provider-approval/index.js diff --git a/ui/app/components/pages/provider-approval/provider-approval.component.js b/ui/app/pages/provider-approval/provider-approval.component.js similarity index 91% rename from ui/app/components/pages/provider-approval/provider-approval.component.js rename to ui/app/pages/provider-approval/provider-approval.component.js index 11895327a509..1f1d68da7f05 100644 --- a/ui/app/components/pages/provider-approval/provider-approval.component.js +++ b/ui/app/pages/provider-approval/provider-approval.component.js @@ -1,6 +1,6 @@ import PropTypes from 'prop-types' import React, { Component } from 'react' -import ProviderPageContainer from '../../provider-page-container' +import ProviderPageContainer from '../../components/app/provider-page-container' export default class ProviderApproval extends Component { static propTypes = { diff --git a/ui/app/components/pages/provider-approval/provider-approval.container.js b/ui/app/pages/provider-approval/provider-approval.container.js similarity index 95% rename from ui/app/components/pages/provider-approval/provider-approval.container.js rename to ui/app/pages/provider-approval/provider-approval.container.js index 28e4531a9785..d53c0ae4dd41 100644 --- a/ui/app/components/pages/provider-approval/provider-approval.container.js +++ b/ui/app/pages/provider-approval/provider-approval.container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux' import ProviderApproval from './provider-approval.component' -import { approveProviderRequest, rejectProviderRequest } from '../../../actions' +import { approveProviderRequest, rejectProviderRequest } from '../../store/actions' function mapDispatchToProps (dispatch) { return { diff --git a/ui/app/app.js b/ui/app/pages/routes/index.js similarity index 85% rename from ui/app/app.js rename to ui/app/pages/routes/index.js index b9f6cafe7709..460cec9584c9 100644 --- a/ui/app/app.js +++ b/ui/app/pages/routes/index.js @@ -3,52 +3,52 @@ import PropTypes from 'prop-types' import { connect } from 'react-redux' import { Route, Switch, withRouter, matchPath } from 'react-router-dom' import { compose } from 'recompose' -import actions from './actions' +import actions from '../../store/actions' import log from 'loglevel' -import { getMetaMaskAccounts, getNetworkIdentifier } from './selectors' +import { getMetaMaskAccounts, getNetworkIdentifier } from '../../selectors/selectors' // init -import FirstTimeFlow from './components/pages/first-time-flow' +import FirstTimeFlow from '../first-time-flow' // accounts -const SendTransactionScreen = require('./components/send/send.container') -const ConfirmTransaction = require('./components/pages/confirm-transaction') +const SendTransactionScreen = require('../../components/app/send/send.container') +const ConfirmTransaction = require('../confirm-transaction') // slideout menu -const Sidebar = require('./components/sidebars').default -const { WALLET_VIEW_SIDEBAR } = require('./components/sidebars/sidebar.constants') +const Sidebar = require('../../components/app/sidebars').default +const { WALLET_VIEW_SIDEBAR } = require('../../components/app/sidebars/sidebar.constants') // other views -import Home from './components/pages/home' -import Settings from './components/pages/settings' -import Authenticated from './higher-order-components/authenticated' -import Initialized from './higher-order-components/initialized' -import Lock from './components/pages/lock' -import UiMigrationAnnouncement from './components/ui-migration-annoucement' -const RestoreVaultPage = require('./components/pages/keychains/restore-vault').default -const RevealSeedConfirmation = require('./components/pages/keychains/reveal-seed') -const MobileSyncPage = require('./components/pages/mobile-sync') -const AddTokenPage = require('./components/pages/add-token') -const ConfirmAddTokenPage = require('./components/pages/confirm-add-token') -const ConfirmAddSuggestedTokenPage = require('./components/pages/confirm-add-suggested-token') -const CreateAccountPage = require('./components/pages/create-account') -const NoticeScreen = require('./components/pages/notice') - -const Loading = require('./components/loading-screen') -const LoadingNetwork = require('./components/loading-network-screen').default -const NetworkDropdown = require('./components/dropdowns/network-dropdown') -import AccountMenu from './components/account-menu' +import Home from '../home' +import Settings from '../settings' +import Authenticated from '../../helpers/higher-order-components/authenticated' +import Initialized from '../../helpers/higher-order-components/initialized' +import Lock from '../lock' +import UiMigrationAnnouncement from '../../components/app/ui-migration-annoucement' +const RestoreVaultPage = require('../keychains/restore-vault').default +const RevealSeedConfirmation = require('../keychains/reveal-seed') +const MobileSyncPage = require('../mobile-sync') +const AddTokenPage = require('../add-token') +const ConfirmAddTokenPage = require('../confirm-add-token') +const ConfirmAddSuggestedTokenPage = require('../confirm-add-suggested-token') +const CreateAccountPage = require('../create-account') +const NoticeScreen = require('../notice/notice') + +const Loading = require('../../components/ui/loading-screen') +const LoadingNetwork = require('../../components/app/loading-network-screen').default +const NetworkDropdown = require('../../components/app/dropdowns/network-dropdown') +import AccountMenu from '../../components/app/account-menu' // Global Modals -const Modal = require('./components/modals/index').Modal +const Modal = require('../../components/app/modals').Modal // Global Alert -const Alert = require('./components/alert') +const Alert = require('../../components/ui/alert') -import AppHeader from './components/app-header' -import UnlockPage from './components/pages/unlock-page' +import AppHeader from '../../components/app/app-header' +import UnlockPage from '../unlock-page' import { submittedPendingTransactionsSelector, -} from './selectors/transactions' +} from '../../selectors/transactions' // Routes import { @@ -68,15 +68,15 @@ import { INITIALIZE_ROUTE, INITIALIZE_UNLOCK_ROUTE, NOTICE_ROUTE, -} from './routes' +} from '../../helpers/constants/routes' // enums import { ENVIRONMENT_TYPE_NOTIFICATION, ENVIRONMENT_TYPE_POPUP, -} from '../../app/scripts/lib/enums' +} from '../../../../app/scripts/lib/enums' -class App extends Component { +class Routes extends Component { componentWillMount () { const { currentCurrency, setCurrentCurrencyToUSD } = this.props @@ -299,7 +299,7 @@ class App extends Component { } } -App.propTypes = { +Routes.propTypes = { currentCurrency: PropTypes.string, setCurrentCurrencyToUSD: PropTypes.func, isLoading: PropTypes.bool, @@ -312,7 +312,6 @@ App.propTypes = { sidebar: PropTypes.object, alertOpen: PropTypes.bool, hideSidebar: PropTypes.func, - isMascara: PropTypes.bool, isOnboarding: PropTypes.bool, isUnlocked: PropTypes.bool, networkDropdownOpen: PropTypes.bool, @@ -388,7 +387,6 @@ function mapStateToProps (state) { currentView: state.appState.currentView, activeAddress: state.appState.activeAddress, transForward: state.appState.transForward, - isMascara: state.metamask.isMascara, isOnboarding: Boolean(!noActiveNotices || seedWords || !isInitialized), isPopup: state.metamask.isPopup, seedWords: state.metamask.seedWords, @@ -432,7 +430,7 @@ function mapDispatchToProps (dispatch, ownProps) { } } -App.contextTypes = { +Routes.contextTypes = { t: PropTypes.func, metricsEvent: PropTypes.func, } @@ -440,4 +438,4 @@ App.contextTypes = { module.exports = compose( withRouter, connect(mapStateToProps, mapDispatchToProps) -)(App) +)(Routes) diff --git a/ui/app/components/pages/settings/settings-tab/settings-tab.component.js b/ui/app/pages/settings/advanced-tab/advanced-tab.component.js similarity index 51% rename from ui/app/components/pages/settings/settings-tab/settings-tab.component.js rename to ui/app/pages/settings/advanced-tab/advanced-tab.component.js index abddaaee808b..d1cad1746e27 100644 --- a/ui/app/components/pages/settings/settings-tab/settings-tab.component.js +++ b/ui/app/pages/settings/advanced-tab/advanced-tab.component.js @@ -1,73 +1,30 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import infuraCurrencies from '../../../../infura-conversion.json' import validUrl from 'valid-url' -import { exportAsFile } from '../../../../util' -import SimpleDropdown from '../../../dropdowns/simple-dropdown' +import { exportAsFile } from '../../../helpers/utils/util' import ToggleButton from 'react-toggle-button' -import { REVEAL_SEED_ROUTE, MOBILE_SYNC_ROUTE } from '../../../../routes' -import locales from '../../../../../../app/_locales/index.json' -import TextField from '../../../text-field' -import Button from '../../../button' +import TextField from '../../../components/ui/text-field' +import Button from '../../../components/ui/button' +import { MOBILE_SYNC_ROUTE } from '../../../helpers/constants/routes' -const sortedCurrencies = infuraCurrencies.objects.sort((a, b) => { - return a.quote.name.toLocaleLowerCase().localeCompare(b.quote.name.toLocaleLowerCase()) -}) - -const infuraCurrencyOptions = sortedCurrencies.map(({ quote: { code, name } }) => { - return { - displayValue: `${code.toUpperCase()} - ${name}`, - key: code, - value: code, - } -}) - -const localeOptions = locales.map(locale => { - return { - displayValue: `${locale.name}`, - key: locale.code, - value: locale.code, - } -}) - -export default class SettingsTab extends PureComponent { +export default class AdvancedTab extends PureComponent { static contextTypes = { t: PropTypes.func, metricsEvent: PropTypes.func, } static propTypes = { - metamask: PropTypes.object, - setUseBlockie: PropTypes.func, setHexDataFeatureFlag: PropTypes.func, - setPrivacyMode: PropTypes.func, - privacyMode: PropTypes.bool, - setCurrentCurrency: PropTypes.func, setRpcTarget: PropTypes.func, - delRpcTarget: PropTypes.func, displayWarning: PropTypes.func, - revealSeedConfirmation: PropTypes.func, - setFeatureFlagToBeta: PropTypes.func, - showClearApprovalModal: PropTypes.func, showResetAccountConfirmationModal: PropTypes.func, warning: PropTypes.string, history: PropTypes.object, - updateCurrentLocale: PropTypes.func, - currentLocale: PropTypes.string, - useBlockie: PropTypes.bool, sendHexData: PropTypes.bool, - currentCurrency: PropTypes.string, - conversionDate: PropTypes.number, - nativeCurrency: PropTypes.string, - useNativeCurrencyAsPrimaryCurrency: PropTypes.bool, - setUseNativeCurrencyAsPrimaryCurrencyPreference: PropTypes.func, setAdvancedInlineGasFeatureFlag: PropTypes.func, advancedInlineGas: PropTypes.bool, - mobileSync: PropTypes.bool, showFiatInTestnets: PropTypes.bool, setShowFiatConversionOnTestnetsPreference: PropTypes.func.isRequired, - participateInMetaMetrics: PropTypes.bool, - setParticipateInMetaMetrics: PropTypes.func, } state = { @@ -78,62 +35,6 @@ export default class SettingsTab extends PureComponent { nickname: '', } - renderCurrentConversion () { - const { t } = this.context - const { currentCurrency, conversionDate, setCurrentCurrency } = this.props - - return ( -
-
- { t('currencyConversion') } - - { t('updatedWithDate', [Date(conversionDate)]) } - -
-
-
- setCurrentCurrency(newCurrency)} - /> -
-
-
- ) - } - - renderCurrentLocale () { - const { t } = this.context - const { updateCurrentLocale, currentLocale } = this.props - const currentLocaleMeta = locales.find(locale => locale.code === currentLocale) - const currentLocaleName = currentLocaleMeta ? currentLocaleMeta.name : '' - - return ( -
-
- - { t('currentLanguage') } - - - { currentLocaleName } - -
-
-
- updateCurrentLocale(newLocale)} - /> -
-
-
- ) - } - renderNewRpcUrl () { const { t } = this.context const { newRpc, chainId, ticker, nickname } = this.state @@ -212,10 +113,10 @@ export default class SettingsTab extends PureComponent { />
{ - e.preventDefault() - this.setState({ showOptions: !this.state.showOptions }) - }} + onClick={e => { + e.preventDefault() + this.setState({ showOptions: !this.state.showOptions }) + }} > { t(this.state.showOptions ? 'hideAdvancedOptions' : 'showAdvancedOptions') } @@ -276,98 +177,26 @@ export default class SettingsTab extends PureComponent { } } - renderStateLogs () { - const { t } = this.context - const { displayWarning } = this.props - - return ( -
-
- { t('stateLogs') } - - { t('stateLogsDescription') } - -
-
-
- -
-
-
- ) - } - - renderClearApproval () { - const { t } = this.context - const { showClearApprovalModal } = this.props - return ( -
-
- { t('approvalData') } - - { t('approvalDataDescription') } - -
-
-
- -
-
-
- ) - } - - renderSeedWords () { + renderMobileSync () { const { t } = this.context const { history } = this.props - +// return (
- { t('revealSeedWords') } + { t('syncWithMobile') }
@@ -375,31 +204,34 @@ export default class SettingsTab extends PureComponent { ) } - - renderMobileSync () { + renderStateLogs () { const { t } = this.context - const { history, mobileSync } = this.props - - if (!mobileSync) { - return - } + const { displayWarning } = this.props return (
- { t('syncWithMobile') } + { t('stateLogs') } + + { t('stateLogsDescription') } +
@@ -407,7 +239,6 @@ export default class SettingsTab extends PureComponent { ) } - renderResetAccount () { const { t } = this.context const { showResetAccountConfirmationModal } = this.props @@ -443,28 +274,6 @@ export default class SettingsTab extends PureComponent { ) } - renderBlockieOptIn () { - const { useBlockie, setUseBlockie } = this.props - - return ( -
-
- { this.context.t('blockiesIdenticon') } -
-
-
- setUseBlockie(!value)} - activeLabel="" - inactiveLabel="" - /> -
-
-
- ) - } - renderHexDataOptIn () { const { t } = this.context const { sendHexData, setHexDataFeatureFlag } = this.props @@ -517,60 +326,6 @@ export default class SettingsTab extends PureComponent { ) } - renderUsePrimaryCurrencyOptions () { - const { t } = this.context - const { - nativeCurrency, - setUseNativeCurrencyAsPrimaryCurrencyPreference, - useNativeCurrencyAsPrimaryCurrency, - } = this.props - - return ( -
-
- { t('primaryCurrencySetting') } -
- { t('primaryCurrencySettingDescription') } -
-
-
-
-
-
- setUseNativeCurrencyAsPrimaryCurrencyPreference(true)} - checked={Boolean(useNativeCurrencyAsPrimaryCurrency)} - /> - -
-
- setUseNativeCurrencyAsPrimaryCurrencyPreference(false)} - checked={!useNativeCurrencyAsPrimaryCurrency} - /> - -
-
-
-
-
- ) - } - renderShowConversionInTestnets () { const { t } = this.context const { @@ -600,80 +355,24 @@ export default class SettingsTab extends PureComponent { ) } - renderPrivacyOptIn () { - const { t } = this.context - const { privacyMode, setPrivacyMode } = this.props - - return ( -
-
- { t('privacyMode') } -
- { t('privacyModeDescription') } -
-
-
-
- setPrivacyMode(!value)} - activeLabel="" - inactiveLabel="" - /> -
-
-
- ) - } - - renderMetaMetricsOptIn () { - const { t } = this.context - const { participateInMetaMetrics, setParticipateInMetaMetrics } = this.props - - return ( -
-
- { t('participateInMetaMetrics') } -
- { t('participateInMetaMetricsDescription') } -
-
-
-
- setParticipateInMetaMetrics(!value)} - activeLabel="" - inactiveLabel="" - /> -
-
-
- ) - } - - render () { + renderContent () { const { warning } = this.props return ( -
+
{ warning &&
{ warning }
} - { this.renderCurrentConversion() } - { this.renderUsePrimaryCurrencyOptions() } - { this.renderShowConversionInTestnets() } - { this.renderCurrentLocale() } - { this.renderNewRpcUrl() } { this.renderStateLogs() } - { this.renderSeedWords() } + { this.renderMobileSync() } + { this.renderNewRpcUrl() } { this.renderResetAccount() } - { this.renderClearApproval() } - { this.renderPrivacyOptIn() } - { this.renderHexDataOptIn() } { this.renderAdvancedGasInputInline() } - { this.renderBlockieOptIn() } - { this.renderMobileSync() } - { this.renderMetaMetricsOptIn() } + { this.renderHexDataOptIn() } + { this.renderShowConversionInTestnets() }
) } + + render () { + return this.renderContent() + } } diff --git a/ui/app/pages/settings/advanced-tab/advanced-tab.container.js b/ui/app/pages/settings/advanced-tab/advanced-tab.container.js new file mode 100644 index 000000000000..69d7e07e6673 --- /dev/null +++ b/ui/app/pages/settings/advanced-tab/advanced-tab.container.js @@ -0,0 +1,48 @@ +import AdvancedTab from './advanced-tab.component' +import { compose } from 'recompose' +import { connect } from 'react-redux' +import { withRouter } from 'react-router-dom' +import { + updateAndSetCustomRpc, + displayWarning, + setFeatureFlag, + showModal, + setShowFiatConversionOnTestnetsPreference, +} from '../../../store/actions' +import {preferencesSelector} from '../../../selectors/selectors' + +const mapStateToProps = state => { + const { appState: { warning }, metamask } = state + const { + featureFlags: { + sendHexData, + advancedInlineGas, + } = {}, + } = metamask + const { showFiatInTestnets } = preferencesSelector(state) + + return { + warning, + sendHexData, + advancedInlineGas, + showFiatInTestnets, + } +} + +const mapDispatchToProps = dispatch => { + return { + setHexDataFeatureFlag: shouldShow => dispatch(setFeatureFlag('sendHexData', shouldShow)), + setRpcTarget: (newRpc, chainId, ticker, nickname) => dispatch(updateAndSetCustomRpc(newRpc, chainId, ticker, nickname)), + displayWarning: warning => dispatch(displayWarning(warning)), + showResetAccountConfirmationModal: () => dispatch(showModal({ name: 'CONFIRM_RESET_ACCOUNT' })), + setAdvancedInlineGasFeatureFlag: shouldShow => dispatch(setFeatureFlag('advancedInlineGas', shouldShow)), + setShowFiatConversionOnTestnetsPreference: value => { + return dispatch(setShowFiatConversionOnTestnetsPreference(value)) + }, + } +} + +export default compose( + withRouter, + connect(mapStateToProps, mapDispatchToProps) +)(AdvancedTab) diff --git a/ui/app/pages/settings/advanced-tab/index.js b/ui/app/pages/settings/advanced-tab/index.js new file mode 100644 index 000000000000..85955174e918 --- /dev/null +++ b/ui/app/pages/settings/advanced-tab/index.js @@ -0,0 +1 @@ +export { default } from './advanced-tab.container' diff --git a/ui/app/components/pages/settings/index.js b/ui/app/pages/settings/index.js similarity index 100% rename from ui/app/components/pages/settings/index.js rename to ui/app/pages/settings/index.js diff --git a/ui/app/pages/settings/index.scss b/ui/app/pages/settings/index.scss new file mode 100644 index 000000000000..52208dc851ab --- /dev/null +++ b/ui/app/pages/settings/index.scss @@ -0,0 +1,143 @@ +@import 'info-tab/index'; + +@import 'settings-tab/index'; + +.settings-page { + position: relative; + background: $white; + display: flex; + flex-flow: column nowrap; + + &__header { + display: flex; + flex-flow: row nowrap; + padding: 12px 24px; + align-items: center; + border-bottom: 1px solid $alto; + flex: 0 0 auto; + + &__title { + flex: 1 0 auto; + font-size: 24px; + } + } + + &__back-button { + display: none; + + @media screen and (max-width: 575px) { + display: block; + background-image: url('/images/caret-left-black.svg'); + width: 18px; + height: 18px; + opacity: .5; + background-size: contain; + background-repeat: no-repeat; + background-position: center; + margin-right: 16px; + cursor: pointer; + } + } + + &__close-button::after { + content: '\00D7'; + font-size: 40px; + color: $dusty-gray; + cursor: pointer; + } + + &__content { + display: flex; + flex-flow: row nowrap; + height: auto; + overflow: auto; + + &__tabs { + display: flex; + flex-direction: column; + flex: 1 1 auto; + + @media screen and (min-width: 576px) { + flex: 0 0 32%; + max-width: 210px; + border-right: 1px solid $alto; + } + } + + &__modules { + overflow-y: auto; + flex: 1 1 auto; + + @media screen and (max-width: 575px) { + display: none; + } + } + } + + &__body { + padding: 12px 24px; + } + + &__content-row { + display: flex; + flex-direction: column; + padding: 10px 0 20px; + } + + &__content-item { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + padding: 0 5px; + min-height: 71px; + + @media screen and (max-width: 575px) { + height: initial; + padding: 5px 0; + } + + &--without-height { + height: initial; + } + } + + &__content-label { + text-transform: capitalize; + } + + &__content-description { + font-size: 14px; + color: $dusty-gray; + padding-top: 5px; + } + + &__content-item-col { + max-width: 300px; + display: flex; + flex-direction: column; + + @media screen and (max-width: 575px) { + max-width: 100%; + width: 100%; + } + } + + &--selected { + .settings-page { + &__content { + &__tabs { + @media screen and (max-width: 575px) { + display: none; + } + } + + &__modules { + @media screen and (max-width: 575px) { + display: block; + } + } + } + } + } +} diff --git a/ui/app/components/pages/settings/info-tab/index.js b/ui/app/pages/settings/info-tab/index.js similarity index 100% rename from ui/app/components/pages/settings/info-tab/index.js rename to ui/app/pages/settings/info-tab/index.js diff --git a/ui/app/components/pages/settings/info-tab/index.scss b/ui/app/pages/settings/info-tab/index.scss similarity index 100% rename from ui/app/components/pages/settings/info-tab/index.scss rename to ui/app/pages/settings/info-tab/index.scss diff --git a/ui/app/components/pages/settings/info-tab/info-tab.component.js b/ui/app/pages/settings/info-tab/info-tab.component.js similarity index 97% rename from ui/app/components/pages/settings/info-tab/info-tab.component.js rename to ui/app/pages/settings/info-tab/info-tab.component.js index 72f7d835eaed..552dd156ee49 100644 --- a/ui/app/components/pages/settings/info-tab/info-tab.component.js +++ b/ui/app/pages/settings/info-tab/info-tab.component.js @@ -101,11 +101,11 @@ export default class InfoTab extends PureComponent { ) } - render () { + renderContent () { const { t } = this.context return ( -
+
@@ -133,4 +133,8 @@ export default class InfoTab extends PureComponent {
) } + + render () { + return this.renderContent() + } } diff --git a/ui/app/pages/settings/security-tab/index.js b/ui/app/pages/settings/security-tab/index.js new file mode 100644 index 000000000000..7ffc291a2663 --- /dev/null +++ b/ui/app/pages/settings/security-tab/index.js @@ -0,0 +1 @@ +export { default } from './security-tab.container' diff --git a/ui/app/pages/settings/security-tab/security-tab.component.js b/ui/app/pages/settings/security-tab/security-tab.component.js new file mode 100644 index 000000000000..233561115e55 --- /dev/null +++ b/ui/app/pages/settings/security-tab/security-tab.component.js @@ -0,0 +1,195 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' +import { exportAsFile } from '../../../helpers/utils/util' +import ToggleButton from 'react-toggle-button' +import { REVEAL_SEED_ROUTE } from '../../../helpers/constants/routes' +import Button from '../../../components/ui/button' + +export default class SecurityTab extends PureComponent { + static contextTypes = { + t: PropTypes.func, + metricsEvent: PropTypes.func, + } + + static propTypes = { + setPrivacyMode: PropTypes.func, + privacyMode: PropTypes.bool, + displayWarning: PropTypes.func, + revealSeedConfirmation: PropTypes.func, + showClearApprovalModal: PropTypes.func, + warning: PropTypes.string, + history: PropTypes.object, + mobileSync: PropTypes.bool, + participateInMetaMetrics: PropTypes.bool, + setParticipateInMetaMetrics: PropTypes.func, + } + + renderStateLogs () { + const { t } = this.context + const { displayWarning } = this.props + + return ( +
+
+ { t('stateLogs') } + + { t('stateLogsDescription') } + +
+
+
+ +
+
+
+ ) + } + + renderClearApproval () { + const { t } = this.context + const { showClearApprovalModal } = this.props + return ( +
+
+ { t('approvalData') } + + { t('approvalDataDescription') } + +
+
+
+ +
+
+
+ ) + } + + renderSeedWords () { + const { t } = this.context + const { history } = this.props + + return ( +
+
+ { t('revealSeedWords') } +
+
+
+ +
+
+
+ ) + } + + renderPrivacyOptIn () { + const { t } = this.context + const { privacyMode, setPrivacyMode } = this.props + + return ( +
+
+ { t('privacyMode') } +
+ { t('privacyModeDescription') } +
+
+
+
+ setPrivacyMode(!value)} + activeLabel="" + inactiveLabel="" + /> +
+
+
+ ) + } + + renderMetaMetricsOptIn () { + const { t } = this.context + const { participateInMetaMetrics, setParticipateInMetaMetrics } = this.props + + return ( +
+
+ { t('participateInMetaMetrics') } +
+ { t('participateInMetaMetricsDescription') } +
+
+
+
+ setParticipateInMetaMetrics(!value)} + activeLabel="" + inactiveLabel="" + /> +
+
+
+ ) + } + + renderContent () { + const { warning } = this.props + + return ( +
+ { warning &&
{ warning }
} + { this.renderPrivacyOptIn() } + { this.renderClearApproval() } + { this.renderSeedWords() } + { this.renderMetaMetricsOptIn() } +
+ ) + } + + render () { + return this.renderContent() + } +} diff --git a/ui/app/pages/settings/security-tab/security-tab.container.js b/ui/app/pages/settings/security-tab/security-tab.container.js new file mode 100644 index 000000000000..6036f4eda2e3 --- /dev/null +++ b/ui/app/pages/settings/security-tab/security-tab.container.js @@ -0,0 +1,42 @@ +import SecurityTab from './security-tab.component' +import { compose } from 'recompose' +import { connect } from 'react-redux' +import { withRouter } from 'react-router-dom' +import { + displayWarning, + revealSeedConfirmation, + setFeatureFlag, + showModal, + setParticipateInMetaMetrics, +} from '../../../store/actions' + +const mapStateToProps = state => { + const { appState: { warning }, metamask } = state + const { + featureFlags: { + privacyMode, + } = {}, + participateInMetaMetrics, + } = metamask + + return { + warning, + privacyMode, + participateInMetaMetrics, + } +} + +const mapDispatchToProps = dispatch => { + return { + displayWarning: warning => dispatch(displayWarning(warning)), + revealSeedConfirmation: () => dispatch(revealSeedConfirmation()), + setPrivacyMode: enabled => dispatch(setFeatureFlag('privacyMode', enabled)), + showClearApprovalModal: () => dispatch(showModal({ name: 'CLEAR_APPROVED_ORIGINS' })), + setParticipateInMetaMetrics: (val) => dispatch(setParticipateInMetaMetrics(val)), + } +} + +export default compose( + withRouter, + connect(mapStateToProps, mapDispatchToProps) +)(SecurityTab) diff --git a/ui/app/components/pages/settings/settings-tab/index.js b/ui/app/pages/settings/settings-tab/index.js similarity index 100% rename from ui/app/components/pages/settings/settings-tab/index.js rename to ui/app/pages/settings/settings-tab/index.js diff --git a/ui/app/components/pages/settings/settings-tab/index.scss b/ui/app/pages/settings/settings-tab/index.scss similarity index 100% rename from ui/app/components/pages/settings/settings-tab/index.scss rename to ui/app/pages/settings/settings-tab/index.scss diff --git a/ui/app/pages/settings/settings-tab/settings-tab.component.js b/ui/app/pages/settings/settings-tab/settings-tab.component.js new file mode 100644 index 000000000000..57e80be0d1c9 --- /dev/null +++ b/ui/app/pages/settings/settings-tab/settings-tab.component.js @@ -0,0 +1,200 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' +import infuraCurrencies from '../../../helpers/constants/infura-conversion.json' +import SimpleDropdown from '../../../components/app/dropdowns/simple-dropdown' +import ToggleButton from 'react-toggle-button' +import locales from '../../../../../app/_locales/index.json' + +const sortedCurrencies = infuraCurrencies.objects.sort((a, b) => { + return a.quote.name.toLocaleLowerCase().localeCompare(b.quote.name.toLocaleLowerCase()) +}) + +const infuraCurrencyOptions = sortedCurrencies.map(({ quote: { code, name } }) => { + return { + displayValue: `${code.toUpperCase()} - ${name}`, + key: code, + value: code, + } +}) + +const localeOptions = locales.map(locale => { + return { + displayValue: `${locale.name}`, + key: locale.code, + value: locale.code, + } +}) + +export default class SettingsTab extends PureComponent { + static contextTypes = { + t: PropTypes.func, + metricsEvent: PropTypes.func, + } + + static propTypes = { + setUseBlockie: PropTypes.func, + setCurrentCurrency: PropTypes.func, + displayWarning: PropTypes.func, + warning: PropTypes.string, + history: PropTypes.object, + updateCurrentLocale: PropTypes.func, + currentLocale: PropTypes.string, + useBlockie: PropTypes.bool, + currentCurrency: PropTypes.string, + conversionDate: PropTypes.number, + nativeCurrency: PropTypes.string, + useNativeCurrencyAsPrimaryCurrency: PropTypes.bool, + setUseNativeCurrencyAsPrimaryCurrencyPreference: PropTypes.func, + } + + renderCurrentConversion () { + const { t } = this.context + const { currentCurrency, conversionDate, setCurrentCurrency } = this.props + + return ( +
+
+ { t('currencyConversion') } + + { t('updatedWithDate', [Date(conversionDate)]) } + +
+
+
+ setCurrentCurrency(newCurrency)} + /> +
+
+
+ ) + } + + renderCurrentLocale () { + const { t } = this.context + const { updateCurrentLocale, currentLocale } = this.props + const currentLocaleMeta = locales.find(locale => locale.code === currentLocale) + const currentLocaleName = currentLocaleMeta ? currentLocaleMeta.name : '' + + return ( +
+
+ + { t('currentLanguage') } + + + { currentLocaleName } + +
+
+
+ updateCurrentLocale(newLocale)} + /> +
+
+
+ ) + } + + + renderBlockieOptIn () { + const { useBlockie, setUseBlockie } = this.props + + return ( +
+
+ { this.context.t('blockiesIdenticon') } +
+
+
+ setUseBlockie(!value)} + activeLabel="" + inactiveLabel="" + /> +
+
+
+ ) + } + + renderUsePrimaryCurrencyOptions () { + const { t } = this.context + const { + nativeCurrency, + setUseNativeCurrencyAsPrimaryCurrencyPreference, + useNativeCurrencyAsPrimaryCurrency, + } = this.props + + return ( +
+
+ { t('primaryCurrencySetting') } +
+ { t('primaryCurrencySettingDescription') } +
+
+
+
+
+
+ setUseNativeCurrencyAsPrimaryCurrencyPreference(true)} + checked={Boolean(useNativeCurrencyAsPrimaryCurrency)} + /> + +
+
+ setUseNativeCurrencyAsPrimaryCurrencyPreference(false)} + checked={!useNativeCurrencyAsPrimaryCurrency} + /> + +
+
+
+
+
+ ) + } + + renderContent () { + const { warning } = this.props + + return ( +
+ { warning &&
{ warning }
} + { this.renderCurrentConversion() } + { this.renderUsePrimaryCurrencyOptions() } + { this.renderCurrentLocale() } + { this.renderBlockieOptIn() } +
+ ) + } + + render () { + return this.renderContent() + } +} diff --git a/ui/app/pages/settings/settings-tab/settings-tab.container.js b/ui/app/pages/settings/settings-tab/settings-tab.container.js new file mode 100644 index 000000000000..d3d8457f0a83 --- /dev/null +++ b/ui/app/pages/settings/settings-tab/settings-tab.container.js @@ -0,0 +1,53 @@ +import SettingsTab from './settings-tab.component' +import { compose } from 'recompose' +import { connect } from 'react-redux' +import { withRouter } from 'react-router-dom' +import { + setCurrentCurrency, + displayWarning, + setUseBlockie, + updateCurrentLocale, + setUseNativeCurrencyAsPrimaryCurrencyPreference, + setParticipateInMetaMetrics, +} from '../../../store/actions' +import { preferencesSelector } from '../../../selectors/selectors' + +const mapStateToProps = state => { + const { appState: { warning }, metamask } = state + const { + currentCurrency, + conversionDate, + nativeCurrency, + useBlockie, + currentLocale, + } = metamask + const { useNativeCurrencyAsPrimaryCurrency } = preferencesSelector(state) + + return { + warning, + currentLocale, + currentCurrency, + conversionDate, + nativeCurrency, + useBlockie, + useNativeCurrencyAsPrimaryCurrency, + } +} + +const mapDispatchToProps = dispatch => { + return { + setCurrentCurrency: currency => dispatch(setCurrentCurrency(currency)), + displayWarning: warning => dispatch(displayWarning(warning)), + setUseBlockie: value => dispatch(setUseBlockie(value)), + updateCurrentLocale: key => dispatch(updateCurrentLocale(key)), + setUseNativeCurrencyAsPrimaryCurrencyPreference: value => { + return dispatch(setUseNativeCurrencyAsPrimaryCurrencyPreference(value)) + }, + setParticipateInMetaMetrics: (val) => dispatch(setParticipateInMetaMetrics(val)), + } +} + +export default compose( + withRouter, + connect(mapStateToProps, mapDispatchToProps) +)(SettingsTab) diff --git a/ui/app/pages/settings/settings.component.js b/ui/app/pages/settings/settings.component.js new file mode 100644 index 000000000000..3d415c6b8582 --- /dev/null +++ b/ui/app/pages/settings/settings.component.js @@ -0,0 +1,137 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' +import { Switch, Route, matchPath } from 'react-router-dom' +import { ENVIRONMENT_TYPE_POPUP } from '../../../../app/scripts/lib/enums' +import { getEnvironmentType } from '../../../../app/scripts/lib/util' +import TabBar from '../../components/app/tab-bar' +import c from 'classnames' +import SettingsTab from './settings-tab' +import AdvancedTab from './advanced-tab' +import InfoTab from './info-tab' +import SecurityTab from './security-tab' +import { + DEFAULT_ROUTE, + ADVANCED_ROUTE, + SECURITY_ROUTE, + GENERAL_ROUTE, + ABOUT_US_ROUTE, + SETTINGS_ROUTE, +} from '../../helpers/constants/routes' + +const ROUTES_TO_I18N_KEYS = { + [GENERAL_ROUTE]: 'general', + [ADVANCED_ROUTE]: 'advanced', + [SECURITY_ROUTE]: 'securityAndPrivacy', + [ABOUT_US_ROUTE]: 'aboutUs', +} + +export default class SettingsPage extends PureComponent { + static propTypes = { + location: PropTypes.object, + history: PropTypes.object, + t: PropTypes.func, + } + + static contextTypes = { + t: PropTypes.func, + } + + isCurrentPath (pathname) { + return this.props.location.pathname === pathname + } + + render () { + const { t } = this.context + const { history, location } = this.props + + const pathnameI18nKey = ROUTES_TO_I18N_KEYS[location.pathname] + const isPopupView = getEnvironmentType(location.href) === ENVIRONMENT_TYPE_POPUP + + return ( +
+
+ { + !this.isCurrentPath(SETTINGS_ROUTE) && ( +
history.push(SETTINGS_ROUTE)} + /> + ) + } +
+ {t(pathnameI18nKey && isPopupView ? pathnameI18nKey : 'settings')} +
+
history.push(DEFAULT_ROUTE)} + /> +
+
+
+ { this.renderTabs() } +
+
+ { this.renderContent() } +
+
+
+ ) + } + + renderTabs () { + const { history, location } = this.props + const { t } = this.context + + return ( + { + if (key === GENERAL_ROUTE && this.isCurrentPath(SETTINGS_ROUTE)) { + return true + } + return matchPath(location.pathname, { path: key, exact: true }) + }} + onSelect={key => history.push(key)} + /> + ) + } + + renderContent () { + return ( + + + + + + + + ) + } +} diff --git a/ui/app/components/pages/unlock-page/index.js b/ui/app/pages/unlock-page/index.js similarity index 100% rename from ui/app/components/pages/unlock-page/index.js rename to ui/app/pages/unlock-page/index.js diff --git a/ui/app/components/pages/unlock-page/index.scss b/ui/app/pages/unlock-page/index.scss similarity index 100% rename from ui/app/components/pages/unlock-page/index.scss rename to ui/app/pages/unlock-page/index.scss diff --git a/ui/app/components/pages/unlock-page/unlock-page.component.js b/ui/app/pages/unlock-page/unlock-page.component.js similarity index 95% rename from ui/app/components/pages/unlock-page/unlock-page.component.js rename to ui/app/pages/unlock-page/unlock-page.component.js index 3ba870885788..3aeb2a59ba5f 100644 --- a/ui/app/components/pages/unlock-page/unlock-page.component.js +++ b/ui/app/pages/unlock-page/unlock-page.component.js @@ -1,11 +1,11 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import Button from '@material-ui/core/Button' -import TextField from '../../text-field' +import TextField from '../../components/ui/text-field' import getCaretCoordinates from 'textarea-caret' import { EventEmitter } from 'events' -import Mascot from '../../mascot' -import { DEFAULT_ROUTE } from '../../../routes' +import Mascot from '../../components/ui/mascot' +import { DEFAULT_ROUTE } from '../../helpers/constants/routes' export default class UnlockPage extends Component { static contextTypes = { @@ -19,6 +19,8 @@ export default class UnlockPage extends Component { onImport: PropTypes.func, onRestore: PropTypes.func, onSubmit: PropTypes.func, + forceUpdateMetamaskState: PropTypes.func, + showOptInModal: PropTypes.func, } constructor (props) { diff --git a/ui/app/components/pages/unlock-page/unlock-page.container.js b/ui/app/pages/unlock-page/unlock-page.container.js similarity index 86% rename from ui/app/components/pages/unlock-page/unlock-page.container.js rename to ui/app/pages/unlock-page/unlock-page.container.js index fe51c809551a..bd43666fc4bb 100644 --- a/ui/app/components/pages/unlock-page/unlock-page.container.js +++ b/ui/app/pages/unlock-page/unlock-page.container.js @@ -1,16 +1,16 @@ import { connect } from 'react-redux' import { withRouter } from 'react-router-dom' import { compose } from 'recompose' -import { getEnvironmentType } from '../../../../../app/scripts/lib/util' -import { ENVIRONMENT_TYPE_POPUP } from '../../../../../app/scripts/lib/enums' -import { DEFAULT_ROUTE, RESTORE_VAULT_ROUTE } from '../../../routes' +import { getEnvironmentType } from '../../../../app/scripts/lib/util' +import { ENVIRONMENT_TYPE_POPUP } from '../../../../app/scripts/lib/enums' +import { DEFAULT_ROUTE, RESTORE_VAULT_ROUTE } from '../../helpers/constants/routes' import { tryUnlockMetamask, forgotPassword, markPasswordForgotten, forceUpdateMetamaskState, showModal, -} from '../../../actions' +} from '../../store/actions' import UnlockPage from './unlock-page.component' const mapStateToProps = state => { diff --git a/ui/app/root.js b/ui/app/root.js deleted file mode 100644 index c95c565811d9..000000000000 --- a/ui/app/root.js +++ /dev/null @@ -1,34 +0,0 @@ -const { Component } = require('react') -const PropTypes = require('prop-types') -const { Provider } = require('react-redux') -const h = require('react-hyperscript') -const { HashRouter } = require('react-router-dom') -const App = require('./app') -const I18nProvider = require('./i18n-provider') -const MetaMetricsProvider = require('./metametrics/metametrics.provider') - -class Root extends Component { - render () { - const { store } = this.props - - return ( - h(Provider, { store }, [ - h(HashRouter, { - hashType: 'noslash', - }, [ - h(MetaMetricsProvider, [ - h(I18nProvider, [ - h(App), - ]), - ]), - ]), - ]) - ) - } -} - -Root.propTypes = { - store: PropTypes.object, -} - -module.exports = Root diff --git a/ui/app/selectors/confirm-transaction.js b/ui/app/selectors/confirm-transaction.js index ccd16fadd053..9b5eda82f9e9 100644 --- a/ui/app/selectors/confirm-transaction.js +++ b/ui/app/selectors/confirm-transaction.js @@ -1,7 +1,7 @@ import { createSelector } from 'reselect' import txHelper from '../../lib/tx-helper' -import { calcTokenAmount } from '../token-util' -import { roundExponential } from '../helpers/confirm-transaction/util' +import { calcTokenAmount } from '../helpers/utils/token-util' +import { roundExponential } from '../helpers/utils/confirm-tx.util' const unapprovedTxsSelector = state => state.metamask.unapprovedTxs const unapprovedMsgsSelector = state => state.metamask.unapprovedMsgs diff --git a/ui/app/selectors/custom-gas.js b/ui/app/selectors/custom-gas.js index 8039c0746a09..ecffb37ca72d 100644 --- a/ui/app/selectors/custom-gas.js +++ b/ui/app/selectors/custom-gas.js @@ -3,22 +3,22 @@ import { conversionUtil, multiplyCurrencies, conversionGreaterThan, -} from '../conversion-util' +} from '../helpers/utils/conversion-util' import { getCurrentCurrency, getIsMainnet, preferencesSelector, -} from '../selectors' +} from './selectors' import { formatCurrency, -} from '../helpers/confirm-transaction/util' +} from '../helpers/utils/confirm-tx.util' import { decEthToConvertedCurrency as ethTotalToConvertedCurrency, -} from '../helpers/conversions.util' +} from '../helpers/utils/conversions.util' import { formatETHFee, -} from '../helpers/formatters' +} from '../helpers/utils/formatters' import { calcGasTotal, -} from '../components/send/send.utils' +} from '../components/app/send/send.utils' import { addHexPrefix } from 'ethereumjs-util' const selectors = { diff --git a/ui/app/selectors/tests/custom-gas.test.js b/ui/app/selectors/custom-gas.test.js similarity index 99% rename from ui/app/selectors/tests/custom-gas.test.js rename to ui/app/selectors/custom-gas.test.js index 73240d997ca6..6df4a60c79f3 100644 --- a/ui/app/selectors/tests/custom-gas.test.js +++ b/ui/app/selectors/custom-gas.test.js @@ -11,7 +11,7 @@ const { getPriceAndTimeEstimates, getRenderableBasicEstimateData, getRenderableEstimateDataForSmallButtonsFromGWEI, -} = proxyquire('../custom-gas', {}) +} = proxyquire('./custom-gas', {}) describe('custom-gas selectors', () => { diff --git a/ui/app/selectors.js b/ui/app/selectors/selectors.js similarity index 94% rename from ui/app/selectors.js rename to ui/app/selectors/selectors.js index 663c3f12b80e..bea2cea33a65 100644 --- a/ui/app/selectors.js +++ b/ui/app/selectors/selectors.js @@ -1,13 +1,13 @@ -import {NETWORK_TYPES} from './constants/common' +import { NETWORK_TYPES } from '../helpers/constants/common' import { stripHexPrefix } from 'ethereumjs-util' const abi = require('human-standard-token-abi') import { transactionsSelector, -} from './selectors/transactions' +} from './transactions' const { multiplyCurrencies, -} = require('./conversion-util') +} = require('../helpers/utils/conversion-util') const selectors = { getSelectedAddress, @@ -47,6 +47,7 @@ const selectors = { getAccountType, getNumberOfAccounts, getNumberOfTokens, + isEthereumNetwork, } module.exports = selectors @@ -292,6 +293,17 @@ function getIsMainnet (state) { return networkType === NETWORK_TYPES.MAINNET } +function isEthereumNetwork (state) { + const networkType = getNetworkIdentifier(state) + const { + KOVAN, + MAINNET, + RINKEBY, + ROPSTEN, + } = NETWORK_TYPES + return [ KOVAN, MAINNET, RINKEBY, ROPSTEN].includes(type => type === networkType) +} + function preferencesSelector ({ metamask }) { return metamask.preferences } diff --git a/ui/app/selectors/transactions.js b/ui/app/selectors/transactions.js index fc1271c59eac..b1d27b333e87 100644 --- a/ui/app/selectors/transactions.js +++ b/ui/app/selectors/transactions.js @@ -4,12 +4,12 @@ import { APPROVED_STATUS, SUBMITTED_STATUS, CONFIRMED_STATUS, -} from '../constants/transactions' +} from '../helpers/constants/transactions' import { TRANSACTION_TYPE_CANCEL, TRANSACTION_TYPE_RETRY, } from '../../../app/scripts/controllers/transactions/enums' -import { hexToDecimal } from '../helpers/conversions.util' +import { hexToDecimal } from '../helpers/utils/conversions.util' import { selectedTokenAddressSelector } from './tokens' import txHelper from '../../lib/tx-helper' diff --git a/ui/app/actions.js b/ui/app/store/actions.js similarity index 98% rename from ui/app/actions.js rename to ui/app/store/actions.js index d8363eba6b21..b2aa28c93628 100644 --- a/ui/app/actions.js +++ b/ui/app/store/actions.js @@ -1,18 +1,18 @@ const abi = require('human-standard-token-abi') const pify = require('pify') -const getBuyEthUrl = require('../../app/scripts/lib/buy-eth-url') -const { getTokenAddressFromTokenObject } = require('./util') +const getBuyEthUrl = require('../../../app/scripts/lib/buy-eth-url') +const { getTokenAddressFromTokenObject } = require('../helpers/utils/util') const { calcTokenBalance, estimateGas, -} = require('./components/send/send.utils') +} = require('../components/app/send/send.utils') const ethUtil = require('ethereumjs-util') -const { fetchLocale } = require('../i18n-helper') +const { fetchLocale } = require('../helpers/utils/i18n-helper') const log = require('loglevel') -const { ENVIRONMENT_TYPE_NOTIFICATION } = require('../../app/scripts/lib/enums') -const { hasUnconfirmedTransactions } = require('./helpers/confirm-transaction/util') -const gasDuck = require('./ducks/gas.duck') -const WebcamUtils = require('../lib/webcam-utils') +const { ENVIRONMENT_TYPE_NOTIFICATION } = require('../../../app/scripts/lib/enums') +const { hasUnconfirmedTransactions } = require('../helpers/utils/confirm-tx.util') +const gasDuck = require('../ducks/gas/gas.duck') +const WebcamUtils = require('../../lib/webcam-utils') var actions = { _setBackgroundConnection: _setBackgroundConnection, @@ -902,6 +902,7 @@ function signMsg (msgData) { log.debug('action - signMsg') return (dispatch, getState) => { dispatch(actions.showLoadingIndication()) + window.onbeforeunload = null return new Promise((resolve, reject) => { log.debug(`actions calling background.signMessage`) @@ -933,7 +934,7 @@ function signPersonalMsg (msgData) { log.debug('action - signPersonalMsg') return (dispatch, getState) => { dispatch(actions.showLoadingIndication()) - + window.onbeforeunload = null return new Promise((resolve, reject) => { log.debug(`actions calling background.signPersonalMessage`) background.signPersonalMessage(msgData, (err, newState) => { @@ -964,7 +965,7 @@ function signTypedMsg (msgData) { log.debug('action - signTypedMsg') return (dispatch, getState) => { dispatch(actions.showLoadingIndication()) - + window.onbeforeunload = null return new Promise((resolve, reject) => { log.debug(`actions calling background.signTypedMessage`) background.signTypedMessage(msgData, (err, newState) => { @@ -1168,6 +1169,7 @@ function sendTx (txData) { log.info(`actions - sendTx: ${JSON.stringify(txData.txParams)}`) return (dispatch, getState) => { log.debug(`actions calling background.approveTransaction`) + window.onbeforeunload = null background.approveTransaction(txData.id, (err) => { if (err) { dispatch(actions.txError(err)) @@ -1230,7 +1232,7 @@ function updateAndApproveTx (txData) { return (dispatch, getState) => { log.debug(`actions calling background.updateAndApproveTx`) dispatch(actions.showLoadingIndication()) - + window.onbeforeunload = null return new Promise((resolve, reject) => { background.updateAndApproveTransaction(txData, err => { dispatch(actions.updateTransactionParams(txData.id, txData.txParams)) @@ -1292,7 +1294,7 @@ function txError (err) { function cancelMsg (msgData) { return (dispatch, getState) => { dispatch(actions.showLoadingIndication()) - + window.onbeforeunload = null return new Promise((resolve, reject) => { log.debug(`background.cancelMessage`) background.cancelMessage(msgData.id, (err, newState) => { @@ -1319,7 +1321,7 @@ function cancelMsg (msgData) { function cancelPersonalMsg (msgData) { return (dispatch, getState) => { dispatch(actions.showLoadingIndication()) - + window.onbeforeunload = null return new Promise((resolve, reject) => { const id = msgData.id background.cancelPersonalMessage(id, (err, newState) => { @@ -1346,7 +1348,7 @@ function cancelPersonalMsg (msgData) { function cancelTypedMsg (msgData) { return (dispatch, getState) => { dispatch(actions.showLoadingIndication()) - + window.onbeforeunload = null return new Promise((resolve, reject) => { const id = msgData.id background.cancelTypedMessage(id, (err, newState) => { @@ -1374,7 +1376,7 @@ function cancelTx (txData) { return (dispatch, getState) => { log.debug(`background.cancelTransaction`) dispatch(actions.showLoadingIndication()) - + window.onbeforeunload = null return new Promise((resolve, reject) => { background.cancelTransaction(txData.id, err => { if (err) { @@ -1408,6 +1410,7 @@ function cancelTx (txData) { */ function cancelTxs (txDataList) { return async (dispatch, getState) => { + window.onbeforeunload = null dispatch(actions.showLoadingIndication()) const txIds = txDataList.map(({id}) => id) const cancellations = txIds.map((id) => new Promise((resolve, reject) => { @@ -1810,6 +1813,7 @@ function addTokens (tokens) { function removeSuggestedTokens () { return (dispatch) => { dispatch(actions.showLoadingIndication()) + window.onbeforeunload = null return new Promise((resolve, reject) => { background.removeSuggestedTokens((err, suggestedTokens) => { dispatch(actions.hideLoadingIndication()) diff --git a/ui/app/store.js b/ui/app/store/store.js similarity index 93% rename from ui/app/store.js rename to ui/app/store/store.js index feebbabc04f1..9f12f469e2a9 100644 --- a/ui/app/store.js +++ b/ui/app/store/store.js @@ -1,7 +1,7 @@ const createStore = require('redux').createStore const applyMiddleware = require('redux').applyMiddleware const thunkMiddleware = require('redux-thunk').default -const rootReducer = require('./reducers') +const rootReducer = require('../ducks') const createLogger = require('redux-logger').createLogger global.METAMASK_DEBUG = process.env.METAMASK_DEBUG diff --git a/ui/index.js b/ui/index.js index bd9ecc28b5b5..ac860e0dbd5f 100644 --- a/ui/index.js +++ b/ui/index.js @@ -1,10 +1,10 @@ const render = require('react-dom').render const h = require('react-hyperscript') -const Root = require('./app/root') -const actions = require('./app/actions') -const configureStore = require('./app/store') +const Root = require('./app/pages') +const actions = require('./app/store/actions') +const configureStore = require('./app/store/store') const txHelper = require('./lib/tx-helper') -const { fetchLocale } = require('./i18n-helper') +const { fetchLocale } = require('./app/helpers/utils/i18n-helper') const log = require('loglevel') module.exports = launchMetamaskUi diff --git a/ui/lib/icon-factory.js b/ui/lib/icon-factory.js index 7fadbceffe45..2ea943297dc8 100644 --- a/ui/lib/icon-factory.js +++ b/ui/lib/icon-factory.js @@ -1,6 +1,6 @@ var iconFactory const isValidAddress = require('ethereumjs-util').isValidAddress -const { checksumAddress } = require('../app/util') +const { checksumAddress } = require('../app/helpers/utils/util') const contractMap = require('eth-contract-metadata') module.exports = function (jazzicon) { diff --git a/ui/lib/lost-accounts-notice.js b/ui/lib/lost-accounts-notice.js index 948b13db61f4..840bd8dca425 100644 --- a/ui/lib/lost-accounts-notice.js +++ b/ui/lib/lost-accounts-notice.js @@ -1,4 +1,4 @@ -const summary = require('../app/util').addressSummary +const summary = require('../app/helpers/utils/util').addressSummary module.exports = function (lostAccounts) { return { diff --git a/ui/lib/tx-helper.js b/ui/lib/tx-helper.js index 260dbaa39f24..cdacc5ed7112 100644 --- a/ui/lib/tx-helper.js +++ b/ui/lib/tx-helper.js @@ -1,4 +1,4 @@ -const valuesFor = require('../app/util').valuesFor +const valuesFor = require('../app/helpers/utils/util').valuesFor const log = require('loglevel') module.exports = function (unapprovedTxs, unapprovedMsgs, personalMsgs, typedMessages, network) {