From 4889de988fe0c0d7474ecf02af4e75d1b868c58d Mon Sep 17 00:00:00 2001 From: Aleksandr Starun Date: Thu, 17 Jan 2019 13:33:13 +0300 Subject: [PATCH 001/136] Added permanent "BEAM_TESTNET" --- CMakeLists.txt | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ff96cda79..cde4fd3c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,14 +137,9 @@ if(SHOW_CODE_LOCATION) add_definitions(-DSHOW_CODE_LOCATION=1) endif() -if(BRANCH_NAME MATCHES "testnet") - add_definitions(-DBEAM_TESTNET) -endif() - -if(BEAM_TESTNET) - add_definitions(-DBEAM_TESTNET) -endif() - +#it's enabled by default for testnet +add_definitions(-DBEAM_TESTNET) + if(MSVC) if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") string(REGEX REPLACE "/W[0-4]" "/W4 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") From d32d4295164cdd9ac3633b4140cc3338e12fe612 Mon Sep 17 00:00:00 2001 From: Aleksandr Starun Date: Thu, 17 Jan 2019 14:46:45 +0300 Subject: [PATCH 002/136] Changed testnet nodes urls --- ui/viewmodel/start_view.cpp | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/ui/viewmodel/start_view.cpp b/ui/viewmodel/start_view.cpp index dba61c449..8d8c4d8ba 100644 --- a/ui/viewmodel/start_view.cpp +++ b/ui/viewmodel/start_view.cpp @@ -50,21 +50,15 @@ namespace const char* Peers[] = { #ifdef BEAM_TESTNET - "3.0.151.23:8100", - "3.0.112.100:8100", - "52.76.251.61:8100", - "3.0.82.115:8100", - "13.250.70.207:8100", - "3.121.25.231:8100", - "52.29.133.183:8100", - "3.122.16.126:8100", - "3.122.5.247:8100", - "18.197.244.193:8100", - "52.52.228.242:8100", - "13.52.69.164:8100", - "52.52.207.165:8100", - "13.52.91.89:8100", - "54.177.6.19:8100" + "ap-node01.testnet.beam.mw:8100", + "ap-node02.testnet.beam.mw:8100", + "ap-node03.testnet.beam.mw:8100", + "eu-node01.testnet.beam.mw:8100", + "eu-node02.testnet.beam.mw:8100", + "eu-node03.testnet.beam.mw:8100", + "us-node01.testnet.beam.mw:8100", + "us-node02.testnet.beam.mw:8100", + "us-node03.testnet.beam.mw:8100" #else "172.104.249.212:8101", "23.239.23.209:8201", From 5c44f2b7f626157ec6b29521f2b76804d1538b2b Mon Sep 17 00:00:00 2001 From: Aleksandr Starun Date: Fri, 18 Jan 2019 12:00:34 +0300 Subject: [PATCH 003/136] Restored "copy to clipboard" button on "Generate Recovery Phrase" screen --- ui/view/start.qml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ui/view/start.qml b/ui/view/start.qml index 6a1a5ff8d..23c1a6cd3 100644 --- a/ui/view/start.qml +++ b/ui/view/start.qml @@ -641,6 +641,12 @@ Item } } + CustomButton { + text: qsTr("copy to clipboard") + icon.source: "qrc:/assets/icon-copy.svg" + onClicked: {viewModel.copyPhrasesToClipboard();} + } + PrimaryButton { id: nextButton text: qsTr("next") From 22ca6eabecce449ca5e45ba494e8fb1da10904c2 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Fri, 18 Jan 2019 15:06:52 +0300 Subject: [PATCH 004/136] implemented NodeClient --- node/CMakeLists.txt | 2 + node/node_client.cpp | 231 ++++++++++++++++++++++++++++++++++++++ node/node_client.h | 70 ++++++++++++ ui/model/node_model.cpp | 241 ++++++++++++---------------------------- ui/model/node_model.h | 37 ++++-- 5 files changed, 397 insertions(+), 184 deletions(-) create mode 100644 node/node_client.cpp create mode 100644 node/node_client.h diff --git a/node/CMakeLists.txt b/node/CMakeLists.txt index 952557e18..7dc562199 100644 --- a/node/CMakeLists.txt +++ b/node/CMakeLists.txt @@ -4,6 +4,8 @@ set(NODE_SRC db.cpp processor.cpp txpool.cpp + node_client.h + node_client.cpp ) if(ANDROID) diff --git a/node/node_client.cpp b/node/node_client.cpp new file mode 100644 index 000000000..deb11dcb5 --- /dev/null +++ b/node/node_client.cpp @@ -0,0 +1,231 @@ +// Copyright 2018 The Beam Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "node_client.h" + +#include "node/node.h" +#include + +#include "pow/external_pow.h" +#include "utility/logger.h" + +#include +#ifdef BEAM_USE_GPU +#include "utility/gpu/gpu_tools.h" +#endif // BEAM_USE_GPU + +namespace +{ + constexpr int kVerificationThreadsMaxAvailable = -1; +} + +namespace beam +{ +NodeClient::NodeClient(INodeClientObserver* observer) + : m_observer(observer) + , m_shouldStartNode(false) + , m_shouldTerminateModel(false) + , m_isRunning(false) +{ +} + +NodeClient::~NodeClient() +{ + try + { + m_shouldTerminateModel = true; + m_waiting.notify_all(); + { + auto r = m_reactor.lock(); + if (r) + { + r->stop(); + if (m_thread) + { + // TODO: check this + m_thread->join(); + } + } + } + } + catch (...) + { + + } +} + +void NodeClient::setKdf(beam::Key::IKdf::Ptr kdf) +{ + m_pKdf = kdf; +} + +void NodeClient::startNode() +{ + m_shouldStartNode = true; + m_waiting.notify_all(); +} + +void NodeClient::stopNode() +{ + m_shouldStartNode = false; + auto reactor = m_reactor.lock(); + if (reactor) + { + reactor->stop(); + } +} + +void NodeClient::start() +{ + m_thread = std::make_shared([this]() + { + try + { + auto reactor = io::Reactor::create(); + m_reactor = reactor;// store weak ref + io::Reactor::Scope scope(*reactor); + + std::mutex localMutex; + + while (!m_shouldTerminateModel) + { + if (!m_shouldStartNode) + { + std::unique_lock lock(localMutex); + + while (!m_shouldStartNode && !m_shouldTerminateModel) + { + m_waiting.wait(lock); + } + } + + if (!m_shouldTerminateModel) + { + bool bErr = true; + try + { + m_shouldStartNode = false; + runLocalNode(); + bErr = false; + } + catch (const std::runtime_error& ex) + { + LOG_ERROR() << ex.what(); + } + catch (const CorruptionException& ex) + { + LOG_ERROR() << "Corruption: " << ex.m_sErr; + } + + if (bErr) + m_observer->onFailedToStartNode(); + } + } + } + catch (...) + { + LOG_ERROR() << "Unhandled exception"; + } + }); +} + +bool NodeClient::isNodeRunning() const +{ + return m_isRunning; +} + +void NodeClient::runLocalNode() +{ +#ifdef BEAM_USE_GPU + std::unique_ptr stratumServer = m_observer->getStratumServer(); +#endif // BEAM_USE_GPU + Node node; + node.m_Cfg.m_Listen.port(m_observer->getLocalNodePort()); + node.m_Cfg.m_Listen.ip(INADDR_ANY); + node.m_Cfg.m_sPathLocal = m_observer->getLocalNodeStorage(); + + { +#ifdef BEAM_USE_GPU + node.m_Cfg.m_MiningThreads = 0; +#else + node.m_Cfg.m_MiningThreads = m_observer->getLocalNodeMiningThreads(); +#endif // BEAM_USE_GPU + node.m_Cfg.m_VerificationThreads = kVerificationThreadsMaxAvailable; + } + + node.m_Keys.SetSingleKey(m_pKdf); + + node.m_Cfg.m_HistoryCompression.m_sPathOutput = m_observer->getTempDir(); + node.m_Cfg.m_HistoryCompression.m_sPathTmp = m_observer->getTempDir(); + + auto peers = m_observer->getLocalNodePeers(); + + for (const auto& peer : peers) + { + io::Address peer_addr; + if (peer_addr.resolve(peer.c_str())) + { + node.m_Cfg.m_Connect.emplace_back(peer_addr); + } + else + { + LOG_ERROR() << "Unable to resolve node address: " << peer; + } + } + + LOG_INFO() << "starting a node on " << node.m_Cfg.m_Listen.port() << " port..."; + + struct MyObserver + :public Node::IObserver + { + Node* m_pNode; + NodeClient* m_pModel; + + void OnSyncProgress() override + { + // make sure no overflow during conversion from SyncStatus to int,int. + Node::SyncStatus s = m_pNode->m_SyncStatus; + + unsigned int nThreshold = static_cast(std::numeric_limits::max()); + while (s.m_Total > nThreshold) + { + s.m_Total >>= 1; + s.m_Done >>= 1; + } + + m_pModel->m_observer->onSyncProgressUpdated(static_cast(s.m_Done), static_cast(s.m_Total)); + } + + } obs; + + obs.m_pNode = &node; + obs.m_pModel = this; + + node.m_Cfg.m_Observer = &obs; + +#ifdef BEAM_USE_GPU + node.Initialize(stratumServer.get()); +#else + node.Initialize(); +#endif // BEAM_USE_GPU + + m_isRunning = true; + m_observer->onStartedNode(); + + io::Reactor::get_Current().run(); + + m_isRunning = false; + m_observer->onStoppedNode(); +} +} \ No newline at end of file diff --git a/node/node_client.h b/node/node_client.h new file mode 100644 index 000000000..8c12aaf56 --- /dev/null +++ b/node/node_client.h @@ -0,0 +1,70 @@ +// Copyright 2018 The Beam Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include +#include +#include "core/block_crypt.h" +#include "utility/io/reactor.h" + +namespace beam +{ +class INodeClientObserver +{ +public: + virtual void onSyncProgressUpdated(int done, int total) = 0; + virtual void onStartedNode() = 0; + virtual void onStoppedNode() = 0; + virtual void onFailedToStartNode() = 0; + + virtual uint16_t getLocalNodePort() = 0; + virtual std::string getLocalNodeStorage() = 0; + virtual unsigned int getLocalNodeMiningThreads() = 0; + virtual std::string getTempDir() = 0; + virtual std::vector getLocalNodePeers() = 0; +#ifdef BEAM_USE_GPU + virtual std::unique_ptr getStratumServer() = 0; +#endif // BEAM_USE_GPU +}; + +class NodeClient +{ +public: + NodeClient(INodeClientObserver* observer); + ~NodeClient(); + + void setKdf(beam::Key::IKdf::Ptr); + void startNode(); + void stopNode(); + + void start(); + + bool isNodeRunning() const; + +private: + void runLocalNode(); + +private: + INodeClientObserver* m_observer; + std::shared_ptr m_thread; + std::weak_ptr m_reactor; + std::atomic m_shouldStartNode; + std::atomic m_shouldTerminateModel; + std::atomic m_isRunning; + std::condition_variable m_waiting; + beam::Key::IKdf::Ptr m_pKdf; +}; +} \ No newline at end of file diff --git a/ui/model/node_model.cpp b/ui/model/node_model.cpp index ba3664096..4fc609018 100644 --- a/ui/model/node_model.cpp +++ b/ui/model/node_model.cpp @@ -29,200 +29,97 @@ using namespace beam; using namespace beam::io; using namespace std; -namespace -{ - constexpr int kVerificationThreadsMaxAvailable = -1; -} - NodeModel::NodeModel() - : m_shouldStartNode(false) - , m_shouldTerminateModel(false) - , m_isRunning(false) -{ -} - -NodeModel::~NodeModel() + : m_nodeClient(this) { - try - { - m_shouldTerminateModel = true; - m_waiting.notify_all(); - { - auto r = m_reactor.lock(); - if (!r) - { - return; - } - r->stop(); - } - wait(); - } - catch (...) - { - } } void NodeModel::setKdf(beam::Key::IKdf::Ptr kdf) { - m_pKdf = kdf; + m_nodeClient.setKdf(kdf); } void NodeModel::startNode() { - m_shouldStartNode = true; - m_waiting.notify_all(); + m_nodeClient.startNode(); } void NodeModel::stopNode() { - m_shouldStartNode = false; - auto reactor = m_reactor.lock(); - if (reactor) - { - reactor->stop(); - } + m_nodeClient.stopNode(); } -bool NodeModel::isNodeRunning() const +void NodeModel::start() { - return m_isRunning; + m_nodeClient.start(); } -void NodeModel::run() +bool NodeModel::isNodeRunning() const { - try - { - auto reactor = io::Reactor::create(); - m_reactor = reactor;// store weak ref - io::Reactor::Scope scope(*reactor); - - mutex localMutex; - - while (!m_shouldTerminateModel) - { - if (!m_shouldStartNode) - { - unique_lock lock(localMutex); - - while (!m_shouldStartNode && !m_shouldTerminateModel) - { - m_waiting.wait(lock); - } - } - - if (!m_shouldTerminateModel) - { - bool bErr = true; - try - { - m_shouldStartNode = false; - runLocalNode(); - bErr = false; - } - catch (const runtime_error& ex) - { - LOG_ERROR() << ex.what(); - } - catch (const CorruptionException& ex) - { - LOG_ERROR() << "Corruption: " << ex.m_sErr; - } - - if (bErr) - AppModel::getInstance()->getMessages().addMessage(tr("Failed to start node. Please check your node configuration")); - } - } - } - catch (...) - { - LOG_ERROR() << "Unhandled exception"; - } + return m_nodeClient.isNodeRunning(); } -void NodeModel::runLocalNode() -{ - auto& settings = AppModel::getInstance()->getSettings(); -#ifdef BEAM_USE_GPU +void NodeModel::onSyncProgressUpdated(int done, int total) +{ + emit syncProgressUpdated(done, total); +} + +void NodeModel::onStartedNode() +{ + emit startedNode(); +} + +void NodeModel::onStoppedNode() +{ + emit stoppedNode(); +} + +void NodeModel::onFailedToStartNode() +{ + AppModel::getInstance()->getMessages().addMessage(tr("Failed to start node. Please check your node configuration")); +} + +uint16_t NodeModel::getLocalNodePort() +{ + return AppModel::getInstance()->getSettings().getLocalNodePort(); +} + +std::string NodeModel::getLocalNodeStorage() +{ + return AppModel::getInstance()->getSettings().getLocalNodeStorage(); +} + +unsigned int NodeModel::getLocalNodeMiningThreads() +{ + return AppModel::getInstance()->getSettings().getLocalNodeMiningThreads(); +} + +std::string NodeModel::getTempDir() +{ + return AppModel::getInstance()->getSettings().getTempDir(); +} + +std::vector NodeModel::getLocalNodePeers() +{ + std::vector result; + + auto peers = AppModel::getInstance()->getSettings().getLocalNodePeers(); + + for (const auto& peer : peers) + { + result.push_back(peer.toStdString()); + } + + return result; +} + +#ifdef BEAM_USE_GPU +std::unique_ptr NodeModel::getStratumServer() +{ + auto& settings = AppModel::getInstance()->getSettings(); GetSupportedCards(); auto devices = settings.getMiningDevices(); - unique_ptr stratumServer = settings.getUseGpu() && !devices.empty() ? IExternalPOW::create_opencl_solver(devices) : nullptr; -#endif - Node node; - node.m_Cfg.m_Listen.port(settings.getLocalNodePort()); - node.m_Cfg.m_Listen.ip(INADDR_ANY); - node.m_Cfg.m_sPathLocal = settings.getLocalNodeStorage(); - - { -#ifdef BEAM_USE_GPU - node.m_Cfg.m_MiningThreads = 0; -#else - node.m_Cfg.m_MiningThreads = settings.getLocalNodeMiningThreads(); -#endif - node.m_Cfg.m_VerificationThreads = kVerificationThreadsMaxAvailable; - } - - node.m_Keys.SetSingleKey(m_pKdf); - - node.m_Cfg.m_HistoryCompression.m_sPathOutput = settings.getTempDir(); - node.m_Cfg.m_HistoryCompression.m_sPathTmp = settings.getTempDir(); - - auto qPeers = settings.getLocalNodePeers(); - - for (const auto& qPeer : qPeers) - { - Address peer_addr; - if (peer_addr.resolve(qPeer.toStdString().c_str())) - { - node.m_Cfg.m_Connect.emplace_back(peer_addr); - } - else - { - LOG_ERROR() << "Unable to resolve node address: " << qPeer.toStdString(); - } - } - - LOG_INFO() << "starting a node on " << node.m_Cfg.m_Listen.port() << " port..."; - - struct MyObserver - :public Node::IObserver - { - Node* m_pNode; - NodeModel* m_pModel; - - void OnSyncProgress() override - { - // make sure no overflow during conversion from SyncStatus to int,int. - Node::SyncStatus s = m_pNode->m_SyncStatus; - - unsigned int nThreshold = static_cast(std::numeric_limits::max()); - while (s.m_Total > nThreshold) - { - s.m_Total >>= 1; - s.m_Done >>= 1; - } - - emit m_pModel->syncProgressUpdated(static_cast(s.m_Done), static_cast(s.m_Total)); - } - - } obs; - - obs.m_pNode = &node; - obs.m_pModel = this; - - node.m_Cfg.m_Observer = &obs; - -#ifdef BEAM_USE_GPU - node.Initialize(stratumServer.get()); -#else - node.Initialize(); -#endif - - m_isRunning = true; - emit startedNode(); - - io::Reactor::get_Current().run(); - - m_isRunning = false; - emit stoppedNode(); -} + return settings.getUseGpu() && !devices.empty() ? IExternalPOW::create_opencl_solver(devices) : nullptr; +} +#endif // BEAM_USE_GPU diff --git a/ui/model/node_model.h b/ui/model/node_model.h index ce1c5a948..7f16ec20c 100644 --- a/ui/model/node_model.h +++ b/ui/model/node_model.h @@ -20,33 +20,46 @@ #include #include "core/block_crypt.h" #include "node/node.h" +#include "node/node_client.h" #include "utility/io/reactor.h" -class NodeModel : public QThread +class NodeModel + : public QObject + , private beam::INodeClientObserver { Q_OBJECT public: + NodeModel(); - ~NodeModel(); void setKdf(beam::Key::IKdf::Ptr); void startNode(); void stopNode(); + void start(); + bool isNodeRunning() const; -private: - void run() override; - void runLocalNode(); signals: void syncProgressUpdated(int done, int total); void startedNode(); void stoppedNode(); -private: - std::weak_ptr m_reactor; - std::atomic m_shouldStartNode; - std::atomic m_shouldTerminateModel; - std::atomic m_isRunning; - std::condition_variable m_waiting; - beam::Key::IKdf::Ptr m_pKdf; + +protected: + void onSyncProgressUpdated(int done, int total) override; + void onStartedNode() override; + void onStoppedNode() override; + void onFailedToStartNode() override; + + uint16_t getLocalNodePort() override; + std::string getLocalNodeStorage() override; + unsigned int getLocalNodeMiningThreads() override; + std::string getTempDir() override; + std::vector getLocalNodePeers() override; +#ifdef BEAM_USE_GPU + std::unique_ptr getStratumServer() override; +#endif // BEAM_USE_GPU + +private: + beam::NodeClient m_nodeClient; }; \ No newline at end of file From 5618cfc6c91ddfb62e35088200933e5da45c01d3 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Fri, 18 Jan 2019 15:14:35 +0300 Subject: [PATCH 005/136] renamed onAdrresses to on Addresses --- .../mw/beam/beamwallet/core/listeners/WalletListener.java | 4 ++-- android/wallet_model.cpp | 6 +++--- android/wallet_model.h | 2 +- ui/model/wallet_model.cpp | 2 +- ui/model/wallet_model.h | 2 +- ui/viewmodel/address_book_view.cpp | 4 ++-- ui/viewmodel/address_book_view.h | 2 +- ui/viewmodel/wallet_view.cpp | 4 ++-- ui/viewmodel/wallet_view.h | 2 +- wallet/wallet_client.cpp | 8 ++++---- wallet/wallet_client.h | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/android/com/mw/beam/beamwallet/core/listeners/WalletListener.java b/android/com/mw/beam/beamwallet/core/listeners/WalletListener.java index 40b6759f0..67e6ee395 100644 --- a/android/com/mw/beam/beamwallet/core/listeners/WalletListener.java +++ b/android/com/mw/beam/beamwallet/core/listeners/WalletListener.java @@ -105,9 +105,9 @@ static void onAllUtxoChanged(UtxoDTO[] utxos) } } - static void onAdrresses(boolean own, WalletAddressDTO[] addresses) + static void onAddresses(boolean own, WalletAddressDTO[] addresses) { - System.out.println(">>>>>>>>>>> onAdrresses(" + own + ") called"); + System.out.println(">>>>>>>>>>> onAddresses(" + own + ") called"); if(addresses != null) { diff --git a/android/wallet_model.cpp b/android/wallet_model.cpp index 6830de705..b1ecfa1dc 100644 --- a/android/wallet_model.cpp +++ b/android/wallet_model.cpp @@ -177,9 +177,9 @@ void WalletModel::onAllUtxoChanged(const std::vector& utxosVec) env->DeleteLocalRef(utxos); } -void WalletModel::onAdrresses(bool own, const std::vector& addresses) +void WalletModel::onAddresses(bool own, const std::vector& addresses) { - LOG_DEBUG() << "onAdrresses(" << own << ")"; + LOG_DEBUG() << "onAddresses(" << own << ")"; JNIEnv* env = Android_JNI_getEnv(); @@ -210,7 +210,7 @@ void WalletModel::onAdrresses(bool own, const std::vector& } } - jmethodID callback = env->GetStaticMethodID(WalletListenerClass, "onAdrresses", "(Z[L" BEAM_JAVA_PATH "/entities/dto/WalletAddressDTO;)V"); + jmethodID callback = env->GetStaticMethodID(WalletListenerClass, "onAddresses", "(Z[L" BEAM_JAVA_PATH "/entities/dto/WalletAddressDTO;)V"); env->CallStaticVoidMethod(WalletListenerClass, callback, own, addrArray); env->DeleteLocalRef(addrArray); diff --git a/android/wallet_model.h b/android/wallet_model.h index 8315cf0ed..d34fd770e 100644 --- a/android/wallet_model.h +++ b/android/wallet_model.h @@ -32,7 +32,7 @@ class WalletModel void onSyncProgressUpdated(int done, int total) override; void onChangeCalculated(beam::Amount change) override; void onAllUtxoChanged(const std::vector& utxos) override; - void onAdrresses(bool own, const std::vector& addrs) override; + void onAddresses(bool own, const std::vector& addrs) override; void onGeneratedNewAddress(const beam::WalletAddress& walletAddr) override; void onChangeCurrentWalletIDs(beam::WalletID senderID, beam::WalletID receiverID) override; void onNodeConnectionChanged(bool isNodeConnected) override; diff --git a/ui/model/wallet_model.cpp b/ui/model/wallet_model.cpp index 3f797f6dd..cbb57913b 100644 --- a/ui/model/wallet_model.cpp +++ b/ui/model/wallet_model.cpp @@ -86,7 +86,7 @@ void WalletModel::onAllUtxoChanged(const std::vector& utxos) emit allUtxoChanged(utxos); } -void WalletModel::onAdrresses(bool own, const std::vector& addrs) +void WalletModel::onAddresses(bool own, const std::vector& addrs) { emit adrresses(own, addrs); } diff --git a/ui/model/wallet_model.h b/ui/model/wallet_model.h index c87584789..054f988b7 100644 --- a/ui/model/wallet_model.h +++ b/ui/model/wallet_model.h @@ -52,7 +52,7 @@ class WalletModel void onSyncProgressUpdated(int done, int total) override; void onChangeCalculated(beam::Amount change) override; void onAllUtxoChanged(const std::vector& utxos) override; - void onAdrresses(bool own, const std::vector& addrs) override; + void onAddresses(bool own, const std::vector& addrs) override; void onGeneratedNewAddress(const beam::WalletAddress& walletAddr) override; void onChangeCurrentWalletIDs(beam::WalletID senderID, beam::WalletID receiverID) override; void onNodeConnectionChanged(bool isNodeConnected) override; diff --git a/ui/viewmodel/address_book_view.cpp b/ui/viewmodel/address_book_view.cpp index 5a33237c0..292c7cbbe 100644 --- a/ui/viewmodel/address_book_view.cpp +++ b/ui/viewmodel/address_book_view.cpp @@ -115,7 +115,7 @@ AddressBookViewModel::AddressBookViewModel() SLOT(onStatus(const WalletStatus&))); connect(&m_model, SIGNAL(adrresses(bool, const std::vector&)), - SLOT(onAdrresses(bool, const std::vector&))); + SLOT(onAddresses(bool, const std::vector&))); getAddressesFromModel(); @@ -254,7 +254,7 @@ void AddressBookViewModel::onStatus(const WalletStatus&) getAddressesFromModel(); } -void AddressBookViewModel::onAdrresses(bool own, const std::vector& addresses) +void AddressBookViewModel::onAddresses(bool own, const std::vector& addresses) { if (own) { diff --git a/ui/viewmodel/address_book_view.h b/ui/viewmodel/address_book_view.h index ac28bc810..0cbfd8877 100644 --- a/ui/viewmodel/address_book_view.h +++ b/ui/viewmodel/address_book_view.h @@ -127,7 +127,7 @@ class AddressBookViewModel : public QObject public slots: void onStatus(const WalletStatus& amount); - void onAdrresses(bool own, const std::vector& addresses); + void onAddresses(bool own, const std::vector& addresses); signals: void contactsChanged(); diff --git a/ui/viewmodel/wallet_view.cpp b/ui/viewmodel/wallet_view.cpp index 0e7850612..a8e20bf06 100644 --- a/ui/viewmodel/wallet_view.cpp +++ b/ui/viewmodel/wallet_view.cpp @@ -213,7 +213,7 @@ WalletViewModel::WalletViewModel() SLOT(onChangeCurrentWalletIDs(beam::WalletID, beam::WalletID))); connect(&_model, SIGNAL(adrresses(bool, const std::vector&)), - SLOT(onAdrresses(bool, const std::vector&))); + SLOT(onAddresses(bool, const std::vector&))); connect(&_model, SIGNAL(generatedNewAddress(const beam::WalletAddress&)), SLOT(onGeneratedNewAddress(const beam::WalletAddress&))); @@ -669,7 +669,7 @@ QString WalletViewModel::getNewReceiverName() const return _newReceiverName; } -void WalletViewModel::onAdrresses(bool own, const std::vector& addresses) +void WalletViewModel::onAddresses(bool own, const std::vector& addresses) { if (own) { diff --git a/ui/viewmodel/wallet_view.h b/ui/viewmodel/wallet_view.h index 9645e8ca7..5f079fc79 100644 --- a/ui/viewmodel/wallet_view.h +++ b/ui/viewmodel/wallet_view.h @@ -193,7 +193,7 @@ public slots: void syncWithNode(); void onChangeCalculated(beam::Amount change); void onChangeCurrentWalletIDs(beam::WalletID senderID, beam::WalletID receiverID); - void onAdrresses(bool own, const std::vector& addresses); + void onAddresses(bool own, const std::vector& addresses); void onGeneratedNewAddress(const beam::WalletAddress& addr); void onSendMoneyVerified(); void onCantSendToExpired(); diff --git a/wallet/wallet_client.cpp b/wallet/wallet_client.cpp index d474a2918..e10854a59 100644 --- a/wallet/wallet_client.cpp +++ b/wallet/wallet_client.cpp @@ -365,8 +365,8 @@ void WalletClient::onSystemStateChanged() void WalletClient::onAddressChanged() { - onAdrresses(true, m_walletDB->getAddresses(true)); - onAdrresses(false, m_walletDB->getAddresses(false)); + onAddresses(true, m_walletDB->getAddresses(true)); + onAddresses(false, m_walletDB->getAddresses(false)); } void WalletClient::onSyncProgress(int done, int total) @@ -449,7 +449,7 @@ void WalletClient::getWalletStatus() { onStatus(getStatus()); onTxStatus(beam::ChangeAction::Reset, m_walletDB->getTxHistory()); - onAdrresses(false, m_walletDB->getAddresses(false)); + onAddresses(false, m_walletDB->getAddresses(false)); } void WalletClient::getUtxosStatus() @@ -460,7 +460,7 @@ void WalletClient::getUtxosStatus() void WalletClient::getAddresses(bool own) { - onAdrresses(own, m_walletDB->getAddresses(own)); + onAddresses(own, m_walletDB->getAddresses(own)); } void WalletClient::cancelTx(const beam::TxID& id) diff --git a/wallet/wallet_client.h b/wallet/wallet_client.h index 1bdfff087..7e661099c 100644 --- a/wallet/wallet_client.h +++ b/wallet/wallet_client.h @@ -64,7 +64,7 @@ class WalletClient virtual void onSyncProgressUpdated(int done, int total) = 0; virtual void onChangeCalculated(beam::Amount change) = 0; virtual void onAllUtxoChanged(const std::vector& utxos) = 0; - virtual void onAdrresses(bool own, const std::vector& addresses) = 0; + virtual void onAddresses(bool own, const std::vector& addresses) = 0; virtual void onGeneratedNewAddress(const beam::WalletAddress& walletAddr) = 0; virtual void onChangeCurrentWalletIDs(beam::WalletID senderID, beam::WalletID receiverID) = 0; virtual void onNodeConnectionChanged(bool isNodeConnected) = 0; From 634f3ac3ce2bcf0fc7170f6aa0d0c7c5e396c14d Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Tue, 22 Jan 2019 17:11:43 +0300 Subject: [PATCH 006/136] added converter from Coin.ID to string --- .../mw/beam/beamwallet/core/entities/dto/UtxoDTO.java | 1 + android/wallet_model.cpp | 1 + wallet/wallet_db.cpp | 10 ++++++++++ wallet/wallet_db.h | 1 + 4 files changed, 13 insertions(+) diff --git a/android/com/mw/beam/beamwallet/core/entities/dto/UtxoDTO.java b/android/com/mw/beam/beamwallet/core/entities/dto/UtxoDTO.java index 8519cfa86..f69ed8bb1 100644 --- a/android/com/mw/beam/beamwallet/core/entities/dto/UtxoDTO.java +++ b/android/com/mw/beam/beamwallet/core/entities/dto/UtxoDTO.java @@ -17,6 +17,7 @@ public class UtxoDTO { public long id; + public String stringId; public long amount; public int status; public long createHeight; diff --git a/android/wallet_model.cpp b/android/wallet_model.cpp index 1d6200516..4873bc1da 100644 --- a/android/wallet_model.cpp +++ b/android/wallet_model.cpp @@ -149,6 +149,7 @@ void WalletModel::onAllUtxoChanged(const std::vector& utxosVec) jobject utxo = env->AllocObject(UtxoClass); setLongField(env, UtxoClass, utxo, "id", coin.m_ID.m_Idx); + setStringField(env, UtxoClass, utxo, "stringId", coin.toStringID()); setLongField(env, UtxoClass, utxo, "amount", coin.m_ID.m_Value); setIntField(env, UtxoClass, utxo, "status", coin.m_status); setLongField(env, UtxoClass, utxo, "createHeight", coin.m_createHeight); diff --git a/wallet/wallet_db.cpp b/wallet/wallet_db.cpp index 993676356..c6c2cda69 100644 --- a/wallet/wallet_db.cpp +++ b/wallet/wallet_db.cpp @@ -923,6 +923,16 @@ namespace beam return m_maturity <= m_lockedHeight; } + string Coin::toStringID() const + { + ID::Packed packed; + packed = m_ID; + + return to_hex(packed.m_Idx.m_pData, packed.m_Idx.nBytes) + + to_hex(packed.m_Type.m_pData, packed.m_Type.nBytes) + + to_hex(packed.m_SubIdx.m_pData, packed.m_SubIdx.nBytes); + } + bool WalletDB::isInitialized(const string& path) { #ifdef WIN32 diff --git a/wallet/wallet_db.h b/wallet/wallet_db.h index a135ecf9e..34bb3b2fd 100644 --- a/wallet/wallet_db.h +++ b/wallet/wallet_db.h @@ -59,6 +59,7 @@ namespace beam Coin(); bool isReward() const; bool isValid() const; + std::string toStringID() const; typedef Key::IDV ID; ID m_ID; From 8272278a47f92ddb1a7ffdb3101f5a9bd8ac70b6 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Wed, 23 Jan 2019 15:35:25 +0300 Subject: [PATCH 007/136] added arm64-v8a --- CMakeLists.txt | 16 +++++++++------- utility/CMakeLists.txt | 5 +++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 20c983d9e..975d854af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -205,13 +205,15 @@ if(ANDROID) add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) include_directories($ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/include/boost-1_68) - if(ANDROID_ABI STREQUAL "armeabi-v7a") - set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/armv7-shared) - elseif(ANDROID_ABI STREQUAL "x86") - set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/x86-shared) - else() - message(FATAL_ERROR "error, ANDROID_ABI not defined.") - endif() + if(ANDROID_ABI STREQUAL "armeabi-v7a") + set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/armv7-shared) + elseif(ANDROID_ABI STREQUAL "x86") + set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/x86-shared) + elseif(ANDROID_ABI STREQUAL "arm64-v8a") + set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/arm64-v8a) + else() + message(FATAL_ERROR "error, ANDROID_ABI not defined.") + endif() else() if(BEAM_USE_STATIC) diff --git a/utility/CMakeLists.txt b/utility/CMakeLists.txt index 09d7e8f60..4205d6526 100644 --- a/utility/CMakeLists.txt +++ b/utility/CMakeLists.txt @@ -77,6 +77,11 @@ if(ANDROID) $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_program_options-clang-mt-x32-1_68.a $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_filesystem-clang-mt-x32-1_68.a $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_system-clang-mt-x32-1_68.a) + elseif(ANDROID_ABI STREQUAL "arm64-v8a") + target_link_libraries(utility + $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_program_options-clang-mt-a64-1_68.a + $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_filesystem-clang-mt-a64-1_68.a + $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_system-clang-mt-a64-1_68.a) endif() else() From 515a7125c358beb62f48c4761092b7b8617a4f1b Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Wed, 23 Jan 2019 18:58:41 +0300 Subject: [PATCH 008/136] added arm8 to builder --- .travis.yml | 34 ++++++++++++++++++++++++++++++++++ CMakeLists.txt | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2ac0b87dd..4e65bd21f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -255,6 +255,40 @@ matrix: - curl --retry 3 --ftp-create-dirs -T libwallet-jni-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni-$BEAM_VERSION.tar.gz +############################################################################### +# Android ARMv8 Release +############################################################################### + + - os: linux + language: android + env: + - ANDROID_ABI=arm64-v8a + - BUILD_TYPE=Release + - ANDROID_SDK_VERSION=23 + android: + components: + - tools + - platform-tools + - android-23 + install: + - echo y | sdkmanager "ndk-bundle" + - wget "https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.sh" + - sudo sh cmake-3.12.0-Linux-x86_64.sh --skip-license --prefix=/usr + - sudo git clone --depth=1 https://github.com/nesbox/boost_1_68-android.git /usr/local/boost_1_68-android + - sudo git clone --depth=1 https://github.com/nesbox/Prebuilt-OpenSSL-Android.git /usr/local/Prebuilt-OpenSSL-Android + - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle + - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android + - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android/Prebuilt + - export PATH=$ANDROID_NDK_HOME:$PATH + script: + - cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake -DANDROID_NATIVE_API_LEVEL=$ANDROID_SDK_VERSION -DANDROID_ABI=$ANDROID_ABI -DCMAKE_BUILD_TYPE=$BUILD_TYPE . + - make wallet-jni -j4 + after_success: + - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI + - tar -cvzf libwallet-jni-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com + - curl --retry 3 --ftp-create-dirs -T libwallet-jni-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ + - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni-$BEAM_VERSION.tar.gz + ############################################################################### # Common part ############################################################################### diff --git a/CMakeLists.txt b/CMakeLists.txt index 975d854af..311dd5876 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -210,7 +210,7 @@ if(ANDROID) elseif(ANDROID_ABI STREQUAL "x86") set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/x86-shared) elseif(ANDROID_ABI STREQUAL "arm64-v8a") - set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/arm64-v8a) + set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/arm64-v8a-shared) else() message(FATAL_ERROR "error, ANDROID_ABI not defined.") endif() From bc9730c49d6036f7190728ec1c589ab178e64445 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Fri, 25 Jan 2019 14:24:17 +0300 Subject: [PATCH 009/136] added kerenlID for android wallet --- .../mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java | 1 + android/wallet_model.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java b/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java index dc74c6862..8f847017f 100644 --- a/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java +++ b/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java @@ -28,4 +28,5 @@ public class TxDescriptionDTO public long modifyTime; public boolean sender; public int status; + public String kernelId; } diff --git a/android/wallet_model.cpp b/android/wallet_model.cpp index 4873bc1da..5eddc9078 100644 --- a/android/wallet_model.cpp +++ b/android/wallet_model.cpp @@ -96,6 +96,7 @@ void WalletModel::onTxStatus(beam::ChangeAction action, const std::vector(item.m_status)); + setStringField(env, TxDescriptionClass, tx, "kernelId", beam::to_hex(item.m_kernelID.m_pData, item.m_kernelID.nBytes)); env->SetObjectArrayElement(txItems, i, tx); From 554f2e2f04ed9a47b63acd119979320e13fddde1 Mon Sep 17 00:00:00 2001 From: Roman Strilets Date: Fri, 25 Jan 2019 22:17:10 +0300 Subject: [PATCH 010/136] #397 process BEAM_TESTNET --- CMakeLists.txt | 41 +++++++++++++++++++++++++------- android/node_model.cpp | 2 +- beam/CMakeLists.txt | 23 +++++++++++++----- explorer/CMakeLists.txt | 12 +++++++--- ui/CMakeLists.txt | 16 ++++++++++--- ui/model/settings.cpp | 4 ++++ ui/ui.cpp | 4 ++++ ui/view/start.qml | 4 ++-- ui/viewmodel/start_view.cpp | 18 ++++++++++++++ ui/viewmodel/start_view.h | 2 ++ wallet/CMakeLists.txt | 47 +++++++++++++++++++++++++++---------- 11 files changed, 136 insertions(+), 37 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 311dd5876..25e61d0ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -337,34 +337,57 @@ if (WIN32) set(CPACK_NSIS_MUI_ICON "${PROJECT_SOURCE_DIR}/ui/icon.ico") set(CPACK_NSIS_MUI_UNIICON "${PROJECT_SOURCE_DIR}/ui/icon.ico") set(CPACK_NSIS_INSTALLED_ICON_NAME "${PROJECT_SOURCE_DIR}/ui/icon.ico") - set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "CreateShortCut \\\"$DESKTOP\\\\Beam Wallet.lnk\\\" \\\"$INSTDIR\\\\Beam Wallet.exe\\\"") - set(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut \\\"$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Beam Wallet.lnk\\\" \\\"$INSTDIR\\\\Beam Wallet.exe\\\"") - set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "Delete \\\"$DESKTOP\\\\Beam Wallet.lnk\\\"") - set(CPACK_NSIS_DELETE_ICONS_EXTRA "Delete \\\"$SMPROGRAMS\\\\$MUI_TEMP\\\\Beam Wallet.lnk\\\"") + if (BEAM_TESTNET) + set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "CreateShortCut \\\"$DESKTOP\\\\Beam Wallet Testnet.lnk\\\" \\\"$INSTDIR\\\\Beam Wallet Testnet.exe\\\"") + set(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut \\\"$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Beam Wallet Testnet.lnk\\\" \\\"$INSTDIR\\\\Beam Wallet Testnet.exe\\\"") + set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "Delete \\\"$DESKTOP\\\\Beam Wallet Testnet.lnk\\\"") + set(CPACK_NSIS_DELETE_ICONS_EXTRA "Delete \\\"$SMPROGRAMS\\\\$MUI_TEMP\\\\Beam Wallet Testnet.lnk\\\"") + + set(CPACK_NSIS_MUI_FINISHPAGE_RUN "Beam Wallet Testnet.exe") + set(CPACK_NSIS_PACKAGE_NAME "Beam Wallet Testnet") + else() + set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "CreateShortCut \\\"$DESKTOP\\\\Beam Wallet.lnk\\\" \\\"$INSTDIR\\\\Beam Wallet.exe\\\"") + set(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut \\\"$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Beam Wallet.lnk\\\" \\\"$INSTDIR\\\\Beam Wallet.exe\\\"") + set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "Delete \\\"$DESKTOP\\\\Beam Wallet.lnk\\\"") + set(CPACK_NSIS_DELETE_ICONS_EXTRA "Delete \\\"$SMPROGRAMS\\\\$MUI_TEMP\\\\Beam Wallet.lnk\\\"") + + set(CPACK_NSIS_MUI_FINISHPAGE_RUN "Beam Wallet.exe") + set(CPACK_NSIS_PACKAGE_NAME "Beam Wallet") + endif() set(CPACK_NSIS_EXECUTABLES_DIRECTORY .) - set(CPACK_NSIS_MUI_FINISHPAGE_RUN "Beam Wallet.exe") - set(CPACK_NSIS_PACKAGE_NAME "Beam Wallet") elseif (APPLE) set(CPACK_GENERATOR "DragNDrop") elseif (LINUX) set(CPACK_GENERATOR "DEB") - set(CPACK_DEBIAN_PACKAGE_NAME "beamwallet") + if (BEAM_TESTNET) + set(CPACK_DEBIAN_PACKAGE_NAME "beamwallettestnet") + else() + set(CPACK_DEBIAN_PACKAGE_NAME "beamwallet") + endif() set(CPACK_DEBIAN_PACKAGE_VERSION ${PROJECT_VERSION}) set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Beam ") set(CPACK_DEBIAN_PACKAGE_SECTION "Network") endif () -set(CPACK_PACKAGE_NAME "BeamWallet") +if (BEAM_TESTNET) + set(CPACK_PACKAGE_NAME "BeamWalletTestnet") +else() + set(CPACK_PACKAGE_NAME "BeamWallet") +endif() set(CPACK_PACKAGE_VENDOR "Beam Vendor") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Scalable confidential cryptocurrency") set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_REVISION}") set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") -set(CPACK_PACKAGE_INSTALL_DIRECTORY "Beam") +if (BEAM_TESTNET) + set(CPACK_PACKAGE_INSTALL_DIRECTORY "BeamTestnet") +else() + set(CPACK_PACKAGE_INSTALL_DIRECTORY "Beam") +endif() set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/TERMS.txt") diff --git a/android/node_model.cpp b/android/node_model.cpp index 132c5bf64..a8846c603 100644 --- a/android/node_model.cpp +++ b/android/node_model.cpp @@ -101,7 +101,7 @@ std::vector NodeModel::getLocalNodePeers() { std::vector result { - #ifdef BEAM_TESTNET +#ifdef BEAM_TESTNET "ap-node01.testnet.beam.mw:8100", "ap-node02.testnet.beam.mw:8100", "ap-node03.testnet.beam.mw:8100", diff --git a/beam/CMakeLists.txt b/beam/CMakeLists.txt index 787683bb2..c54ae3ce8 100644 --- a/beam/CMakeLists.txt +++ b/beam/CMakeLists.txt @@ -1,4 +1,8 @@ -set(TARGET_NAME beam-node) +if (BEAM_TESTNET) + set(TARGET_NAME beam-node-testnet) +else() + set(TARGET_NAME beam-node) +endif() add_executable(${TARGET_NAME} cli.cpp) @@ -13,8 +17,15 @@ add_dependencies(${TARGET_NAME} node external_pow) target_link_libraries(${TARGET_NAME} node external_pow) if (BEAM_SIGN_PACKAGE AND WIN32) - add_custom_command( - TARGET ${TARGET_NAME} POST_BUILD - COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\beam-node.exe" - ) -endif() + if (BEAM_TESTNET) + add_custom_command( + TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\beam-node.exe" + ) + else() + add_custom_command( + TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\beam-node.exe" + ) + endif() +endif() \ No newline at end of file diff --git a/explorer/CMakeLists.txt b/explorer/CMakeLists.txt index 584d55fdf..14ab8aada 100644 --- a/explorer/CMakeLists.txt +++ b/explorer/CMakeLists.txt @@ -1,3 +1,9 @@ +if (BEAM_TESTNET) + set(TARGET_NAME explorer-node-testnet) +else() + set(TARGET_NAME explorer-node) +endif() + set(EXPLORER_SRC server.cpp adapter.cpp @@ -7,8 +13,8 @@ add_library(explorer STATIC ${EXPLORER_SRC}) add_dependencies(explorer node http) target_link_libraries(explorer node http) -add_executable(explorer-node explorer_node.cpp) -add_dependencies(explorer-node explorer) -target_link_libraries(explorer-node explorer) +add_executable(${TARGET_NAME} explorer_node.cpp) +add_dependencies(${TARGET_NAME} explorer) +target_link_libraries(${TARGET_NAME} explorer) add_subdirectory(unittest) diff --git a/ui/CMakeLists.txt b/ui/CMakeLists.txt index 7ec9bdf50..3effa525d 100644 --- a/ui/CMakeLists.txt +++ b/ui/CMakeLists.txt @@ -1,9 +1,19 @@ set (TARGET_NAME "beam-wallet-ui") -if(LINUX) - set (OUTPUT_NAME "BeamWallet") + +if (BEAM_TESTNET) + if(LINUX) + set (OUTPUT_NAME "BeamWalletTestnet") + else() + set (OUTPUT_NAME "Beam Wallet Testnet") + endif() else() - set (OUTPUT_NAME "Beam Wallet") + if(LINUX) + set (OUTPUT_NAME "BeamWallet") + else() + set (OUTPUT_NAME "Beam Wallet") + endif() endif() + set (CMAKE_PREFIX_PATH $ENV{QT5_ROOT_DIR}) find_package(Qt5 COMPONENTS Qml Quick Svg PrintSupport REQUIRED) diff --git a/ui/model/settings.cpp b/ui/model/settings.cpp index d4dfd808d..b42339fe0 100644 --- a/ui/model/settings.cpp +++ b/ui/model/settings.cpp @@ -132,7 +132,11 @@ void WalletSettings::setRunLocalNode(bool value) uint WalletSettings::getLocalNodePort() const { Lock lock(m_mutex); +#ifdef BEAM_TESTNET + return m_data.value(LocalNodePort, 10006).toUInt(); +#else return m_data.value(LocalNodePort, 10005).toUInt(); +#endif // BEAM_TESTNET } void WalletSettings::setLocalNodePort(uint port) diff --git a/ui/ui.cpp b/ui/ui.cpp index e482a4b92..98a6562c1 100644 --- a/ui/ui.cpp +++ b/ui/ui.cpp @@ -80,7 +80,11 @@ using namespace beam; using namespace std; using namespace ECC; +#ifdef BEAM_TESTNET +static const char* AppName = "Beam Wallet Testnet"; +#else static const char* AppName = "Beam Wallet"; +#endif // BEAM_TESTNET int main (int argc, char* argv[]) { diff --git a/ui/view/start.qml b/ui/view/start.qml index bdabd56e9..4bd95f3f4 100644 --- a/ui/view/start.qml +++ b/ui/view/start.qml @@ -1267,7 +1267,7 @@ Item font.pixelSize: 14 color: Style.white - text: "10005" + text: viewModel.defaultPortToListen() onTextChanged: if (portInput.text.length > 0) portError.text = "" } SFText { @@ -1367,7 +1367,7 @@ Item width: parent.width - parent.spacing - remoteNodeButton.width font.pixelSize: 14 color: Style.white - text: "127.0.0.1:10005" + text: viewModel.defaultRemoteNodeAddr() validator: RegExpValidator { regExp: /^(\s|\x180E)*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])|([\w.-]+(?:\.[\w\.-]+)+))(:([0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?(\s|\x180E)*$/ } onTextChanged: if (remoteNodeAddrInput.text.length > 0) remoteNodeAddrError.text = "" bottomPadding: 8 // TODO add default value of this item to controls diff --git a/ui/viewmodel/start_view.cpp b/ui/viewmodel/start_view.cpp index b5dd62511..212101246 100644 --- a/ui/viewmodel/start_view.cpp +++ b/ui/viewmodel/start_view.cpp @@ -591,4 +591,22 @@ QString StartViewModel::selectCustomWalletDB() QStandardPaths::writableLocation(QStandardPaths::DesktopLocation), tr("SQLite database file (*.db)")); return filePath; +} + +QString StartViewModel::defaultPortToListen() const +{ +#ifdef BEAM_TESTNET + return "10006"; +#else + return "10005"; +#endif // BEAM_TESTNET +} + +QString StartViewModel::defaultRemoteNodeAddr() const +{ +#ifdef BEAM_TESTNET + return "127.0.0.1:10006"; +#else + return "127.0.0.1:10005"; +#endif // BEAM_TESTNET } \ No newline at end of file diff --git a/ui/viewmodel/start_view.h b/ui/viewmodel/start_view.h index ec6e950c2..634442622 100644 --- a/ui/viewmodel/start_view.h +++ b/ui/viewmodel/start_view.h @@ -130,6 +130,8 @@ class StartViewModel : public QObject Q_INVOKABLE void migrateWalletDB(const QString& path); Q_INVOKABLE void copyToClipboard(const QString& text); Q_INVOKABLE QString selectCustomWalletDB(); + Q_INVOKABLE QString defaultPortToListen() const; + Q_INVOKABLE QString defaultRemoteNodeAddr() const; signals: void walletExistsChanged(); diff --git a/wallet/CMakeLists.txt b/wallet/CMakeLists.txt index 43566f54d..4321f6062 100644 --- a/wallet/CMakeLists.txt +++ b/wallet/CMakeLists.txt @@ -1,4 +1,8 @@ -set(TARGET_NAME beam-wallet) +if (BEAM_TESTNET) + set(TARGET_NAME beam-wallet-testnet) +else() + set(TARGET_NAME beam-wallet) +endif() add_definitions( -DSQLITE_HAS_CODEC ) @@ -37,23 +41,40 @@ add_library(wallet_api_proto STATIC api.cpp) add_dependencies(wallet_api_proto wallet utility) target_link_libraries(wallet_api_proto wallet utility) -add_executable(wallet-api api_cli.cpp) -add_dependencies(wallet-api wallet utility wallet_api_proto) -target_link_libraries(wallet-api wallet utility wallet_api_proto) +if (BEAM_TESTNET) + set(WALLET_API_NAME wallet-api-testnet) +else() + set(WALLET_API_NAME wallet-api) +endif() + +add_executable(${WALLET_API_NAME} api_cli.cpp) +add_dependencies(${WALLET_API_NAME} wallet utility wallet_api_proto) +target_link_libraries(${WALLET_API_NAME} wallet utility wallet_api_proto) if(LINUX) - target_link_libraries(wallet-api -static-libstdc++ -static-libgcc) + target_link_libraries(${WALLET_API_NAME} -static-libstdc++ -static-libgcc) endif() add_subdirectory(unittests) if (BEAM_SIGN_PACKAGE AND WIN32) - add_custom_command( - TARGET ${TARGET_NAME} POST_BUILD - COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\beam-wallet.exe" - ) - add_custom_command( - TARGET ${TARGET_NAME} POST_BUILD - COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\wallet-api.exe" - ) + if (BEAM_TESTNET) + add_custom_command( + TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\beam-wallet-testnet.exe" + ) + add_custom_command( + TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\wallet-api-tetnet.exe" + ) + else() + add_custom_command( + TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\beam-wallet.exe" + ) + add_custom_command( + TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\wallet-api.exe" + ) + endif() endif() \ No newline at end of file From 5ae23108087dd678c1220e5957d1253fb07d281b Mon Sep 17 00:00:00 2001 From: Roman Strilets Date: Fri, 25 Jan 2019 22:17:48 +0300 Subject: [PATCH 011/136] #397 enabled testnet flag --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 25e61d0ff..ef74b806b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -138,6 +138,7 @@ if(SHOW_CODE_LOCATION) endif() #it's enabled by default for testnet +set(BEAM_TESTNET TRUE) add_definitions(-DBEAM_TESTNET) if(MSVC) From 32e6ebad7b52a53681c2148b24c09826a359cb84 Mon Sep 17 00:00:00 2001 From: Roman Strilets Date: Fri, 25 Jan 2019 22:49:04 +0300 Subject: [PATCH 012/136] #397 configured travis and appveyor for testnet --- .travis.yml | 62 ++++++++++++++++++++++++++-------------------------- appveyor.yml | 52 +++++++++++++++++++++---------------------- 2 files changed, 57 insertions(+), 57 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4e65bd21f..0ee74a9fa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,15 +19,15 @@ matrix: - brew install qt5 cmake boost - brew link qt5 --force - export PATH=/usr/local/opt/qt/bin:$PATH - - export BEAM_WALLET_UI_IN="BeamWallet-$BEAM_VERSION-Darwin.dmg" + - export BEAM_WALLET_UI_IN="BeamWalletTestnet-$BEAM_VERSION-Darwin.dmg" - export OPENSSL_ROOT_DIR="/usr/local/opt/openssl" - - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet.dmg" + - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet-Testnet.dmg" env: - BUILD_TYPE=Debug - OS_FOLDER=mac script: - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBRANCH_NAME=$TRAVIS_BRANCH . && make -j 4 && ctest --verbose && cpack; - - export BEAM_WALLET_UI_OUT="Beam-Wallet-$BEAM_VERSION.dmg" + - export BEAM_WALLET_UI_OUT="Beam-Wallet-Testnet-$BEAM_VERSION.dmg" ############################################################################### # OSX Release @@ -47,14 +47,14 @@ matrix: - export OPENSSL_ROOT_DIR="/usr/local/opt/openssl" - export QT5_ROOT_DIR="/usr/local/qt5-static" - export QML_IMPORT_PATH="/usr/local/qt5-static/qml" - - export BEAM_WALLET_UI_IN="BeamWallet-$BEAM_VERSION-Darwin.dmg" - - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet.dmg" + - export BEAM_WALLET_UI_IN="BeamWalletTestnet-$BEAM_VERSION-Darwin.dmg" + - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet-Testnet.dmg" env: - BUILD_TYPE=Release - OS_FOLDER=mac script: - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DDEBUG_MESSAGES_IN_RELEASE_MODE=On -DBEAM_LINK_TYPE=Static -DBRANCH_NAME=$TRAVIS_BRANCH . && make -j 4 && ctest --verbose && cpack; - - export BEAM_WALLET_UI_OUT="Beam-Wallet-$BEAM_VERSION.dmg" + - export BEAM_WALLET_UI_OUT="Beam-Wallet-Testnet-$BEAM_VERSION.dmg" ############################################################################### # OSX Release GPU @@ -74,15 +74,15 @@ matrix: - export OPENSSL_ROOT_DIR="/usr/local/opt/openssl" - export QT5_ROOT_DIR="/usr/local/qt5-static" - export QML_IMPORT_PATH="/usr/local/qt5-static/qml" - - export BEAM_WALLET_UI_IN="BeamWallet-$BEAM_VERSION-Darwin.dmg" - - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet.dmg" + - export BEAM_WALLET_UI_IN="BeamWalletTestnet-$BEAM_VERSION-Darwin.dmg" + - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet-Testnet.dmg" env: - BUILD_TYPE=Release - OS_FOLDER=mac - GPU_FOLDER=/gpu script: - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DDEBUG_MESSAGES_IN_RELEASE_MODE=On -DBEAM_LINK_TYPE=Static -DBRANCH_NAME=$TRAVIS_BRANCH -DBEAM_USE_GPU=On . && make -j 4 && ctest --verbose && cpack; - - export BEAM_WALLET_UI_OUT="Beam-Wallet-$BEAM_VERSION.dmg" + - export BEAM_WALLET_UI_OUT="Beam-Wallet-Testnet-$BEAM_VERSION.dmg" ############################################################################### # Linux Debug @@ -108,14 +108,14 @@ matrix: - sudo apt-get install qt510declarative qt510svg libgl1-mesa-dev-lts-xenial - eval "CC=gcc-7 && CXX=g++-7" - export PATH=/opt/qt510/bin:$PATH - - export BEAM_WALLET_UI_IN="BeamWallet-$BEAM_VERSION-Linux.deb" - - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet.deb" + - export BEAM_WALLET_UI_IN="BeamWalletTestnet-$BEAM_VERSION-Linux.deb" + - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet-Testnet.deb" env: - BUILD_TYPE=Debug - OS_FOLDER=linux script: - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBRANCH_NAME=$TRAVIS_BRANCH . && make -j 4 && ctest --verbose && cpack; - - export BEAM_WALLET_UI_OUT="Beam-Wallet-$BEAM_VERSION.deb" + - export BEAM_WALLET_UI_OUT="Beam-Wallet-Testnet-$BEAM_VERSION.deb" ############################################################################### # Linux Release @@ -142,14 +142,14 @@ matrix: - git clone --depth=1 https://github.com/nesbox/qt5-static-linux.git /home/travis/qt5-static - export QT5_ROOT_DIR="/home/travis/qt5-static" - export QML_IMPORT_PATH="/home/travis/qt5-static/qml" - - export BEAM_WALLET_UI_IN="BeamWallet-$BEAM_VERSION-Linux.deb" - - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet.deb" + - export BEAM_WALLET_UI_IN="BeamWalletTestnet-$BEAM_VERSION-Linux.deb" + - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet-Testnet.deb" env: - BUILD_TYPE=Release - OS_FOLDER=linux script: - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DDEBUG_MESSAGES_IN_RELEASE_MODE=On -DBEAM_LINK_TYPE=Static -DBRANCH_NAME=$TRAVIS_BRANCH . && make -j 4 && ctest --verbose && cpack; - - export BEAM_WALLET_UI_OUT="Beam-Wallet-$BEAM_VERSION.deb" + - export BEAM_WALLET_UI_OUT="Beam-Wallet-Testnet-$BEAM_VERSION.deb" ############################################################################### # Linux Release GPU @@ -177,15 +177,15 @@ matrix: - git clone --depth=1 https://github.com/nesbox/qt5-static-linux.git /home/travis/qt5-static - export QT5_ROOT_DIR="/home/travis/qt5-static" - export QML_IMPORT_PATH="/home/travis/qt5-static/qml" - - export BEAM_WALLET_UI_IN="BeamWallet-$BEAM_VERSION-Linux.deb" - - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet.deb" + - export BEAM_WALLET_UI_IN="BeamWalletTestnet-$BEAM_VERSION-Linux.deb" + - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet-Testnet.deb" env: - BUILD_TYPE=Release - OS_FOLDER=linux - GPU_FOLDER=/gpu script: - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DDEBUG_MESSAGES_IN_RELEASE_MODE=On -DBEAM_LINK_TYPE=Static -DBRANCH_NAME=$TRAVIS_BRANCH -DBEAM_USE_GPU=On . && make -j 4 && ctest --verbose && cpack; - - export BEAM_WALLET_UI_OUT="Beam-Wallet-$BEAM_VERSION.deb" + - export BEAM_WALLET_UI_OUT="Beam-Wallet-Testnet-$BEAM_VERSION.deb" ############################################################################### # Android x86 Release @@ -304,31 +304,31 @@ after_success: # deploy using ftp server - OS_FOLDER=$OS_FOLDER$GPU_FOLDER - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER - - tar -cvzf beam-node-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/beam beam-node beam-node.cfg - - tar -cvzf beam-wallet-cli-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/wallet beam-wallet beam-wallet.cfg - - tar -cvzf wallet-api-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/wallet wallet-api + - tar -cvzf beam-node-testnet-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/beam beam-node-testnet beam-node.cfg + - tar -cvzf beam-wallet-testnet-cli-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/wallet Beam-Wallet-Testnet Beam-Wallet.cfg + - tar -cvzf wallet-api-testnet-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/wallet wallet-api-testnet # prep for deploy to AWS S3 - cp $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_IN $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_OUT # create package for advanced users - mkdir pack && mkdir pack/wallet && mkdir pack/node && mkdir pack/ui - - cp wallet/beam-wallet* pack/wallet && cp beam/beam-node* pack/node && cp "$BEAM_WALLET_UI_IN" pack/ui/$BEAM_WALLET_UI_OUT_VERLESS - - tar -cvzf beam-pack-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/pack wallet node ui + - cp wallet/beam-wallet-testnet* pack/wallet && cp beam/beam-node-testnet* pack/node && cp "$BEAM_WALLET_UI_IN" pack/ui/$BEAM_WALLET_UI_OUT_VERLESS + - tar -cvzf beam-pack-testnet-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/pack wallet node ui # upload binaries to FTP - - curl --retry 3 --ftp-create-dirs -T beam-node-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - - curl --retry 3 --ftp-create-dirs -T beam-wallet-cli-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - - curl --retry 3 --ftp-create-dirs -T wallet-api-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ + - curl --retry 3 --ftp-create-dirs -T beam-node-testnet-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ + - curl --retry 3 --ftp-create-dirs -T beam-wallet-testnet-cli-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ + - curl --retry 3 --ftp-create-dirs -T wallet-api-testnet-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - curl --retry 3 --ftp-create-dirs -T "$HOME/build/BeamMW/beam/$BEAM_WALLET_UI_IN" "$BUILDS_SERVER_PATH/$BEAM_WALLET_UI_OUT" - - curl --retry 3 --ftp-create-dirs -T beam-pack-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/pack/ + - curl --retry 3 --ftp-create-dirs -T beam-pack-testnet-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/pack/ # upload binaries to S3 - - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" beam-node-$BEAM_VERSION.tar.gz - - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" beam-wallet-cli-$BEAM_VERSION.tar.gz - - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" wallet-api-$BEAM_VERSION.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" beam-node-testnet-$BEAM_VERSION.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" beam-wallet-testnet-cli-$BEAM_VERSION.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" wallet-api-testnet-$BEAM_VERSION.tar.gz - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_OUT - - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/pack/" beam-pack-$BEAM_VERSION.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/pack/" beam-pack-testnet-$BEAM_VERSION.tar.gz notifications: diff --git a/appveyor.yml b/appveyor.yml index ddc32f02e..80f9e64c9 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -51,37 +51,37 @@ after_build: set BEAM_VERSION=%BEAM_VERSION_PREFIX%.%BEAM_VERSION_REVISION% - 7z a c:/projects/beam/beam/%BUILD_CONFIG%/beam-node-%BEAM_VERSION%.zip c:/projects/beam/beam/%BUILD_CONFIG%/beam-node.exe c:/projects/beam/beam/beam-node.cfg + 7z a c:/projects/beam/beam/%BUILD_CONFIG%/beam-node-testnet-%BEAM_VERSION%.zip c:/projects/beam/beam/%BUILD_CONFIG%/beam-node-testnet.exe c:/projects/beam/beam/beam-node.cfg - 7z a c:/projects/beam/beam/%BUILD_CONFIG%/beam-wallet-cli-%BEAM_VERSION%.zip c:/projects/beam/wallet/%BUILD_CONFIG%/beam-wallet.exe c:/projects/beam/wallet/beam-wallet.cfg + 7z a c:/projects/beam/beam/%BUILD_CONFIG%/beam-wallet-cli-testnet-%BEAM_VERSION%.zip c:/projects/beam/wallet/%BUILD_CONFIG%/beam-wallet-testnet.exe c:/projects/beam/wallet/beam-wallet.cfg - 7z a c:/projects/beam/beam/%BUILD_CONFIG%/wallet-api-%BEAM_VERSION%.zip c:/projects/beam/wallet/%BUILD_CONFIG%/wallet-api.exe + 7z a c:/projects/beam/beam/%BUILD_CONFIG%/wallet-api-testnet-%BEAM_VERSION%.zip c:/projects/beam/wallet/%BUILD_CONFIG%/wallet-api-testnet.exe mkdir pack && cd pack && mkdir wallet && mkdir node && mkdir ui && cd .. mkdir pdb - copy "c:\projects\beam\BeamWallet-%BEAM_VERSION%-win64.exe" "pack\ui\Beam-Wallet.exe" + copy "c:\projects\beam\BeamWalletTestnet-%BEAM_VERSION%-win64.exe" "pack\ui\Beam-Wallet-Testnet.exe" - copy beam\%BUILD_CONFIG%\beam-node.exe pack\node && copy beam\beam-node.cfg pack\node + copy beam\%BUILD_CONFIG%\beam-node-testnet.exe pack\node && copy beam\beam-node.cfg pack\node - copy wallet\%BUILD_CONFIG%\beam-wallet.exe pack\wallet && copy wallet\beam-wallet.cfg pack\wallet + copy wallet\%BUILD_CONFIG%\beam-wallet-testnet.exe pack\wallet && copy wallet\beam-wallet.cfg pack\wallet - 7z a c:/projects/beam/beam/beam-pack-%BEAM_VERSION%.zip %CD%\pack\wallet %CD%\pack\node %CD%\pack\ui + 7z a c:/projects/beam/beam/beam-pack-testnet-%BEAM_VERSION%.zip %CD%\pack\wallet %CD%\pack\node %CD%\pack\ui - 7z a c:/projects/beam/beam/beam-pdb-%BEAM_VERSION%.zip "c:/projects/beam/ui/%BUILD_CONFIG%/Beam Wallet.pdb" "c:/projects/beam/beam/%BUILD_CONFIG%/beam-node.pdb" "c:/projects/beam/wallet/%BUILD_CONFIG%/beam-wallet.pdb" + 7z a c:/projects/beam/beam/beam-pdb-testnet-%BEAM_VERSION%.zip "c:/projects/beam/ui/%BUILD_CONFIG%/Beam Wallet Testnet.pdb" "c:/projects/beam/beam/%BUILD_CONFIG%/beam-node-testnet.pdb" "c:/projects/beam/wallet/%BUILD_CONFIG%/beam-wallet-testnet.pdb" - copy c:\projects\beam\beam\%BUILD_CONFIG%\beam-node-%BEAM_VERSION%.zip c:\projects\beam\beam-node-%BEAM_VERSION%.zip + copy c:\projects\beam\beam\%BUILD_CONFIG%\beam-node-testnet-%BEAM_VERSION%.zip c:\projects\beam\beam-node-testnet-%BEAM_VERSION%.zip - copy c:\projects\beam\beam\%BUILD_CONFIG%\beam-wallet-cli-%BEAM_VERSION%.zip c:\projects\beam\beam-wallet-cli-%BEAM_VERSION%.zip + copy c:\projects\beam\beam\%BUILD_CONFIG%\beam-wallet-cli-testnet-%BEAM_VERSION%.zip c:\projects\beam\beam-wallet-cli-testnet-%BEAM_VERSION%.zip - copy c:\projects\beam\beam\%BUILD_CONFIG%\wallet-api-%BEAM_VERSION%.zip c:\projects\beam\wallet-api-%BEAM_VERSION%.zip + copy c:\projects\beam\beam\%BUILD_CONFIG%\wallet-api-testnet-%BEAM_VERSION%.zip c:\projects\beam\wallet-api-testnet-%BEAM_VERSION%.zip - copy c:\projects\beam\beam\beam-pack-%BEAM_VERSION%.zip c:\projects\beam\pack\beam-pack-%BEAM_VERSION%.zip + copy c:\projects\beam\beam\beam-pack-testnet-%BEAM_VERSION%.zip c:\projects\beam\pack\beam-pack-testnet-%BEAM_VERSION%.zip - copy c:\projects\beam\beam\beam-pdb-%BEAM_VERSION%.zip c:\projects\beam\pdb\beam-pdb-%BEAM_VERSION%.zip + copy c:\projects\beam\beam\beam-pdb-testnet-%BEAM_VERSION%.zip c:\projects\beam\pdb\beam-pdb-testnet-%BEAM_VERSION%.zip - copy c:\projects\beam\BeamWallet-%BEAM_VERSION%-win64.exe c:\projects\beam\Beam-Wallet-%BEAM_VERSION%.exe + copy c:\projects\beam\BeamWalletTestnet-%BEAM_VERSION%-win64.exe c:\projects\beam\Beam-Wallet-Testnet-%BEAM_VERSION%.exe on_success: - ps: $env:DATE=[TimeZoneInfo]::ConvertTimeBySystemTimeZoneId([DateTime]::UtcNow, "Belarus Standard Time").ToString('yyyy.MM.dd') @@ -95,35 +95,35 @@ on_success: set BUILDS_SERVER_PATH=%BUILD_SERVER%/files/%APPVEYOR_REPO_BRANCH%/%DATE%/Release/win%GPU_FOLDER% - curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/%BUILD_CONFIG%/beam-node-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%beam-node-%BEAM_VERSION%.zip" + curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/%BUILD_CONFIG%/beam-node-testnet-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%beam-node-testnet-%BEAM_VERSION%.zip" - curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/%BUILD_CONFIG%/beam-wallet-cli-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%beam-wallet-cli-%BEAM_VERSION%.zip" + curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/%BUILD_CONFIG%/beam-wallet-cli-testnet-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%beam-wallet-cli-testnet-%BEAM_VERSION%.zip" - curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/%BUILD_CONFIG%/wallet-api-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%wallet-api-%BEAM_VERSION%.zip" + curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/%BUILD_CONFIG%/wallet-api-testnet-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%wallet-api-testnet-%BEAM_VERSION%.zip" - curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/BeamWallet-%BEAM_VERSION%-win64.exe" "%BUILDS_SERVER_PATH%Beam-Wallet-%BEAM_VERSION%.exe" + curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/BeamWalletTestnet-%BEAM_VERSION%-win64.exe" "%BUILDS_SERVER_PATH%Beam-Wallet-Testnet-%BEAM_VERSION%.exe" - curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/beam-pack-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%pack/beam-pack-%BEAM_VERSION%.zip" + curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/beam-pack-testnet-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%pack/beam-pack-testnet-%BEAM_VERSION%.zip" - curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/beam-pdb-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%pdb/beam-pdb-%BEAM_VERSION%.zip" + curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/beam-pdb-testnet-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%pdb/beam-pdb-testnet-%BEAM_VERSION%.zip" artifacts: - - path: beam-node-%BEAM_VERSION%.zip + - path: beam-node-testnet-%BEAM_VERSION%.zip name: BeamNode - - path: beam-wallet-cli-%BEAM_VERSION%.zip + - path: beam-wallet-cli-testnet-%BEAM_VERSION%.zip name: BeamWalletCli - - path: wallet-api-%BEAM_VERSION%.zip + - path: wallet-api-testnet-%BEAM_VERSION%.zip name: BeamWalletApi - - path: pack/beam-pack-%BEAM_VERSION%.zip + - path: pack/beam-pack-testnet-%BEAM_VERSION%.zip name: BeamPack - - path: pdb/beam-pdb-%BEAM_VERSION%.zip + - path: pdb/beam-pdb-testnet-%BEAM_VERSION%.zip name: BeamPdb - - path: Beam-Wallet-%BEAM_VERSION%.exe + - path: Beam-Wallet-Testnet-%BEAM_VERSION%.exe name: BeamWallet deploy: From 510561d29352902fc54f1caa1f889521988943e2 Mon Sep 17 00:00:00 2001 From: Roman Strilets Date: Mon, 28 Jan 2019 10:42:55 +0300 Subject: [PATCH 013/136] #397 configured resources files for testnet --- ui/Info.plist | 4 ++-- ui/beam.desktop | 6 +++--- ui/beam.rc.in | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ui/Info.plist b/ui/Info.plist index 693e8fa47..4a3b3180f 100644 --- a/ui/Info.plist +++ b/ui/Info.plist @@ -9,7 +9,7 @@ CFBundleDevelopmentRegion English CFBundleExecutable - Beam Wallet + Beam Wallet Testnet CFBundleGetInfoString CFBundleIconFile @@ -21,7 +21,7 @@ CFBundleLongVersionString CFBundleName - Beam Wallet + Beam Wallet Testnet CFBundlePackageType APPL CFBundleShortVersionString diff --git a/ui/beam.desktop b/ui/beam.desktop index 8269f8923..c0d4ccd8b 100644 --- a/ui/beam.desktop +++ b/ui/beam.desktop @@ -1,11 +1,11 @@ [Desktop Entry] Version=1.0 -Name=Beam Wallet +Name=Beam Wallet Testnet Comment=Scalable confidential cryptocurrency -Exec=/usr/bin/BeamWallet %U +Exec=/usr/bin/BeamWalletTestnet %U Icon=beam Terminal=false Type=Application Categories=Network MimeType=application/x-beam-item; -GenericName=Beam Wallet +GenericName=Beam Wallet Testnet diff --git a/ui/beam.rc.in b/ui/beam.rc.in index b77678c37..3eec92664 100644 --- a/ui/beam.rc.in +++ b/ui/beam.rc.in @@ -18,11 +18,11 @@ BEGIN BLOCK "04090000" BEGIN VALUE "CompanyName", "Beam" - VALUE "FileDescription", "Beam Wallet" + VALUE "FileDescription", "Beam Wallet Testnet" VALUE "FileVersion", "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_REVISION@" - VALUE "InternalName", "Beam Wallet.exe" + VALUE "InternalName", "Beam Wallet Testnet.exe" VALUE "LegalCopyright", "https://beam-mw.com (C) 2018" - VALUE "OriginalFilename", "Beam Wallet.exe" + VALUE "OriginalFilename", "Beam Wallet Testnet.exe" VALUE "ProductName", "Beam" VALUE "ProductVersion", "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_REVISION@" END From c8ea7830c8629c0f05d0a46f2f6213d58a183841 Mon Sep 17 00:00:00 2001 From: Roman Strilets Date: Mon, 28 Jan 2019 16:13:43 +0300 Subject: [PATCH 014/136] #397 changed colors for testnet --- ui/view/controls/Style.qml | 10 +- ui/view/settings.qml | 112 ++++++++++----------- ui/view/wallet.qml | 198 ++++++++++++++++++------------------- 3 files changed, 157 insertions(+), 163 deletions(-) diff --git a/ui/view/controls/Style.qml b/ui/view/controls/Style.qml index 4491bf0db..71458654e 100644 --- a/ui/view/controls/Style.qml +++ b/ui/view/controls/Style.qml @@ -9,15 +9,17 @@ QtObject { property color heliotrope: "#da68f5" property color bright_teal: "#00f6d2" property color bright_sky_blue: "#0bccf7" - property color dark_slate_blue: "#1c435b" + property color dark_slate_blue: "#342e41" property color white: "#ffffff" - property color navy: "#02253c" - property color marine: "#032e49" - property color light_navy: "#0e3850" + property color navy: "#181223" + property color marine: "#1e172c" + property color light_navy: "#292236" property color bluey_grey: "#8da1ad" property color separator_color: "#33566b" property color disable_text_color: "#889da9" property color combobox_color: "#0a4b66" property color validator_color: "#ff625c" + property color general_tx_info_color: "#3e384a" + property color table_row_color1: "#332d40" } diff --git a/ui/view/settings.qml b/ui/view/settings.qml index e93edd0e0..f126e2452 100644 --- a/ui/view/settings.qml +++ b/ui/view/settings.qml @@ -9,7 +9,7 @@ import Beam.Wallet 1.0 Rectangle { anchors.fill: parent - color: "#032e48" + color: Style.marine SettingsViewModel {id: viewModel} @@ -167,27 +167,27 @@ Rectangle { } } - SFText { - text: qsTr("Mining threads (CPU)") - color: (localNodeRun.checked && !useGpu.checked) ? Style.white : Style.disable_text_color - font.pixelSize: 12 - font.styleName: "Bold"; font.weight: Font.Bold - } - - FeeSlider { - id: localNodeMiningThreads - precision: 0 - showTicks: true - Layout.fillWidth: true - value: viewModel.localNodeMiningThreads - to: {viewModel.coreAmount()} - stepSize: 1 - enabled: localNodeRun.checked && !useGpu.checked - Binding { - target: viewModel - property: "localNodeMiningThreads" - value: localNodeMiningThreads.value - } + SFText { + text: qsTr("Mining threads (CPU)") + color: (localNodeRun.checked && !useGpu.checked) ? Style.white : Style.disable_text_color + font.pixelSize: 12 + font.styleName: "Bold"; font.weight: Font.Bold + } + + FeeSlider { + id: localNodeMiningThreads + precision: 0 + showTicks: true + Layout.fillWidth: true + value: viewModel.localNodeMiningThreads + to: {viewModel.coreAmount()} + stepSize: 1 + enabled: localNodeRun.checked && !useGpu.checked + Binding { + target: viewModel + property: "localNodeMiningThreads" + value: localNodeMiningThreads.value + } } CustomSwitch { @@ -213,36 +213,36 @@ Rectangle { text: qsTr("You have unsupported videocard") } - ListView { - Layout.fillWidth: true - Layout.fillHeight: true - Layout.minimumWidth: 140 - visible: viewModel.showUseGpu() && viewModel.hasSupportedGpu() - enabled: useGpu.checked - model: viewModel.supportedDevices - clip: true - delegate: RowLayout { - width: parent.width - height: 22 - - CustomCheckBox { - id: device_id - font.pixelSize: 12 - enabled: localNodeRun.checked - palette.windowText: enabled ? Style.white : Style.disable_text_color - checked: modelData.enabled - text: modelData.name - onToggled: { - viewModel.propertiesChanged(); - } - Binding { - target: modelData - property: "enabled" - value: device_id.checked - } - } - } - } + ListView { + Layout.fillWidth: true + Layout.fillHeight: true + Layout.minimumWidth: 140 + visible: viewModel.showUseGpu() && viewModel.hasSupportedGpu() + enabled: useGpu.checked + model: viewModel.supportedDevices + clip: true + delegate: RowLayout { + width: parent.width + height: 22 + + CustomCheckBox { + id: device_id + font.pixelSize: 12 + enabled: localNodeRun.checked + palette.windowText: enabled ? Style.white : Style.disable_text_color + checked: modelData.enabled + text: modelData.name + onToggled: { + viewModel.propertiesChanged(); + } + Binding { + target: modelData + property: "enabled" + value: device_id.checked + } + } + } + } } ColumnLayout { Layout.fillWidth: true @@ -504,7 +504,7 @@ Rectangle { } } RowLayout { - Layout.fillWidth: true + Layout.fillWidth: true CustomButton { text: "save wallet logs" palette.buttonText : "white" @@ -522,7 +522,7 @@ Rectangle { onClicked: { confirmRefreshDialog.open(); } - } + } } SFText { @@ -556,7 +556,7 @@ Rectangle { } } Item { - Layout.fillHeight: true; + Layout.fillHeight: true; } } @@ -569,7 +569,7 @@ Rectangle { Layout.fillHeight: true } } - ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + ScrollBar.horizontal.policy: ScrollBar.AlwaysOff ScrollBar.vertical.policy: ScrollBar.AsNeeded } diff --git a/ui/view/wallet.qml b/ui/view/wallet.qml index 8c10afff2..35c3099c6 100644 --- a/ui/view/wallet.qml +++ b/ui/view/wallet.qml @@ -16,13 +16,13 @@ Item { onSendMoneyVerified: { walletView.enabled = true console.log("onSendMoneyVerified"); - walletView.pop(); + walletView.pop(); } onCantSendToExpired: { walletView.enabled = true - console.log("can't send to expired address"); - cantSendToExpiredDialog.open(); + console.log("can't send to expired address"); + cantSendToExpiredDialog.open(); } } @@ -46,25 +46,25 @@ Item { anchors.fill: parent } - contentItem: Column { - anchors.fill: parent - anchors.margins: 30 - - spacing: 40 - - SFText { - anchors.horizontalCenter: parent.horizontalCenter - text: qsTr("Can't send to the expired address.") - color: Style.white - font.pixelSize: 14 - font.styleName: "Bold"; font.weight: Font.Bold + contentItem: Column { + anchors.fill: parent + anchors.margins: 30 + + spacing: 40 + + SFText { + anchors.horizontalCenter: parent.horizontalCenter + text: qsTr("Can't send to the expired address.") + color: Style.white + font.pixelSize: 14 + font.styleName: "Bold"; font.weight: Font.Bold } - PrimaryButton { - text: qsTr("ok") - anchors.horizontalCenter: parent.horizontalCenter - icon.source: "qrc:/assets/icon-done.svg" - onClicked: cantSendToExpiredDialog.close() + PrimaryButton { + text: qsTr("ok") + anchors.horizontalCenter: parent.horizontalCenter + icon.source: "qrc:/assets/icon-done.svg" + onClicked: cantSendToExpiredDialog.close() } } } @@ -196,8 +196,8 @@ Item { } StatusBar { - id: status_bar - model: statusbarModel + id: status_bar + model: statusbarModel } ///////////////////////////////////////////////////////////// @@ -226,21 +226,21 @@ Item { } RowLayout { - Layout.fillWidth: true - - Item { - Layout.fillWidth: true - // TODO: find better solution, because it's bad - Layout.minimumHeight: 220 - Column { - anchors.fill: parent + Layout.fillWidth: true + + Item { + Layout.fillWidth: true + // TODO: find better solution, because it's bad + Layout.minimumHeight: 220 + Column { + anchors.fill: parent spacing: 10 - SFText { - font.pixelSize: 14 - font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white - text: qsTr("My address") + SFText { + font.pixelSize: 14 + font.styleName: "Bold"; font.weight: Font.Bold + color: Style.white + text: qsTr("My address") } SFTextInput { @@ -300,31 +300,31 @@ Item { target: viewModel property: "newReceiverName" value: myAddressName.text - } - } - } - - Item { - Layout.fillWidth: true - // TODO: find better solution, because it's bad - Layout.minimumHeight: 220 - Column { - anchors.fill: parent - Image { - anchors.horizontalCenter: parent.horizontalCenter - fillMode: Image.Pad - - source: viewModel.newReceiverAddrQR - } + } + } + } + + Item { + Layout.fillWidth: true + // TODO: find better solution, because it's bad + Layout.minimumHeight: 220 + Column { + anchors.fill: parent + Image { + anchors.horizontalCenter: parent.horizontalCenter + fillMode: Image.Pad + + source: viewModel.newReceiverAddrQR + } SFText { anchors.horizontalCenter: parent.horizontalCenter font.pixelSize: 14 font.italic: true color: Style.white text: qsTr("Scan to send") - } - } - } + } + } + } } SFText { @@ -363,7 +363,7 @@ Item { Component.onDestruction: { // TODO: "Save" may be deleted in future, when we'll have editor for own addresses. - viewModel.saveNewAddress(); + viewModel.saveNewAddress(); } Item { @@ -383,7 +383,7 @@ Item { property Item defaultFocusItem: receiverAddrInput Component.onCompleted: { - receiverAddrInput.text = ""; + receiverAddrInput.text = ""; } ColumnLayout { @@ -400,9 +400,9 @@ Item { } Item { - Layout.fillHeight: true - Layout.minimumHeight: 10 - Layout.maximumHeight: 30 + Layout.fillHeight: true + Layout.minimumHeight: 10 + Layout.maximumHeight: 30 } RowLayout { @@ -776,9 +776,9 @@ Item { } Item { - Layout.fillHeight: true - Layout.minimumHeight: 10 - Layout.maximumHeight: 30 + Layout.fillHeight: true + Layout.minimumHeight: 10 + Layout.maximumHeight: 30 } Row { @@ -883,17 +883,17 @@ Item { onCopyValueText: viewModel.copyToClipboard(value) } - SecondaryPanel { - Layout.minimumWidth: 350 - Layout.fillHeight: true - Layout.fillWidth: true - - title: qsTr("In progress") - receiving: viewModel.receiving - sending: viewModel.sending - maturing: viewModel.maturing - - onCopyValueText: viewModel.copyToClipboard(value) + SecondaryPanel { + Layout.minimumWidth: 350 + Layout.fillHeight: true + Layout.fillWidth: true + + title: qsTr("In progress") + receiving: viewModel.receiving + sending: viewModel.sending + maturing: viewModel.maturing + + onCopyValueText: viewModel.copyToClipboard(value) } } } @@ -919,13 +919,6 @@ Item { } } - Rectangle { - anchors.fill: parent; - anchors.topMargin: 394+46-33 - - color: "#0a344d" - } - CustomTableView { id: transactionsView @@ -1195,7 +1188,7 @@ Item { Rectangle { height: transactionsView.rowHeight width: parent.width - color: styleData.alternate ? "transparent" : Style.light_navy + color: styleData.alternate ? Style.table_row_color1 : Style.light_navy } Item { id: txDetails @@ -1207,16 +1200,15 @@ Item { property int maximumHeight: 200 + commentTx.contentHeight onMaximumHeightChanged: { - if (!rowItem.collapsed) { - rowItem.height = maximumHeight + transactionsView.rowHeight - txDetails.height = maximumHeight - } + if (!rowItem.collapsed) { + rowItem.height = maximumHeight + transactionsView.rowHeight + txDetails.height = maximumHeight + } } Rectangle { anchors.fill: parent - color: Style.bright_sky_blue - opacity: 0.1 + color: Style.general_tx_info_color } RowLayout { anchors.fill: parent @@ -1243,18 +1235,18 @@ Item { color: Style.bluey_grey text: qsTr("Sending address:") } - SFLabel { - copyMenuEnabled: true - font.pixelSize: 14 - color: Style.white - text: { - if(!!viewModel.transactions[styleData.row]) - { - return viewModel.transactions[styleData.row].sendingAddress; - } - return ""; - } - onCopyText: viewModel.copyToClipboard(text) + SFLabel { + copyMenuEnabled: true + font.pixelSize: 14 + color: Style.white + text: { + if(!!viewModel.transactions[styleData.row]) + { + return viewModel.transactions[styleData.row].sendingAddress; + } + return ""; + } + onCopyText: viewModel.copyToClipboard(text) } SFText { @@ -1455,16 +1447,16 @@ Item { initialItem: wallet_layout pushEnter: Transition { - enabled: false + enabled: false } pushExit: Transition { - enabled: false + enabled: false } popEnter: Transition { - enabled: false + enabled: false } popExit: Transition { - enabled: false + enabled: false } onCurrentItemChanged: { From fbd628c3fce603ffbfcdf0a0a23774392439591b Mon Sep 17 00:00:00 2001 From: Roman Strilets Date: Mon, 28 Jan 2019 16:27:26 +0300 Subject: [PATCH 015/136] #397 changed icon.png for testnet --- ui/beam.png | Bin 69789 -> 46273 bytes ui/view/assets/icon.png | Bin 69789 -> 46273 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ui/beam.png b/ui/beam.png index dc54aac6286d6f928df0832827cd79603ded3340..4eed6be89e8d7f4babec49997b27b00971f17d8c 100644 GIT binary patch literal 46273 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 R)Bp(hNsB9p6}>d_`G4OAt4RO= literal 69789 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�K6Z^=5?st}e@x>Ikt8RLlJ33h}7A;uuP%;ydHV6$m#l=$Favak(Bb+8P;k20P&cOzr zBsRT%%7Ei@7Ozktcr3hLvTPKZNd}z77cVCeB|mo{N%XGA<+`SGi=-}f& z9=0ZZiAEdqL`-Epna77`sEt%+fcitYLw};YVNv@tX~D=z(vC$R|0T^C;Bd0_S3(CuAssCU1&>8d2Fi_hFILP~P|NP*Sx5tG0QUSX z0Y7M%dqy{ipMoM+@vMZ_1N(AMzJjakzRA;+EEP3^BH8P=+Tiqfu1i|r8oNGUt}&eu zW=0PlT*+ssIMu-#SzY4h8M|Wb>eX=+x`g z*!_(gK(dQO+Hw)IFBZ&IkTs+Bv?b%8sjD~PX#<*qiwrbsl-FxMu%7^x8|$6Z^{sfw zb6;_+H3jK!wVsGbZH*p>OaWXJxXi5D}o zRTIW!^Dx{IKOmM5mgj>8No@g-nnw9#={_i{rpMF$wp{&Qi-IhcCWiJjk=|w} zkfiJ&%Ib8!lae}?aus+30c?*}9KNQkx>r?@Ft82WtB102x$jAmU})VZzE|28Q_DSZ zk6?ID=j9V6HljRSeSYWz>T_TnBAFj-l1~_zht{i2Wk(~5iGNpLq}Jce2KD>u#hIVD zNTfsg``bv?Yd~kdNiVPEi2_M9dQbK=lB~!ZV3J zB}WfQte8I`t(m(A_D?hhAx^loRQ*gC9VS0DeDG-Xn}iwyGX>DXbV|NtWUHMd90$xN zZt;iC`8E_$O@>GTYDgu(%Zz96W6S~1unaKN+cvJ3tc&=*_-Lnrg()A>3T3Q02hm2x z>N14~gvft~S_0~XBneSorq$}d8u^TL>MgO}(EN@6Dv&y5y%5*GEjl-d;}B?Z6yb;l zcdx%P#lk6Qhk*G2<_8Ua%vcC`s-~a4D1Owm(BnX+Zh>szivesB1wLQqq;xGUgjV=h zCt1UWlprC`k>>r6KmMY?PcQMzjIq=Y?$Xt?&2X!o8>DXT-U3hJAOVQQ%i7NPfV)Js znm^OdOg|K=YyW;+zy?BL7&0AlSKOE(4zT|Y*cMGaJ@7Id7WT-y3n%C?^N;cPSd~61 zAuOt|I@V|eS#0Ey0pu_!CWx0kB7jbD)H-j4aXcdgy;s}2s7T-PzC#PM1s`aM1fRvL zmxlu}ViEtG5C(nX4SmsJbFQ@b)?7aAuVzt(c$6up4W44}-BU#>;ISrRyFiBF)9)^Q z6w0)mBTjW?$L1fPkSFOp9NzSzEL3fcFCv09dMEGrRo-^1%9>>|R zhp>huBwVTQCQ}lweMZV2jA) zPJDM_oWV}fx8@3IkqJcx;-!iUxucVYFTwyIl*3{1i5cg}1fD)pEaKSq7O5S^X-Y+Xn zdiUNFKG~cgU#^4fQy4VRvuZP02X+S$!C{|(lCTec(W*=du1?{6gReT1H5!OujJT?pBDGFw*2G*Hf3CQk68T`3MT<&bygIGKYBUbH{pHbYgnqm%@a49v06DiJ@t#Y_OB=hQhdEz-0kWZzwypGYo#NJG=B}ddmVzwmy!Lhug(bP%U0~+A#MYVBH=AI5 zlzY`6V5+znqV;EPz^jbC{#wm8(G>Dj(~npZTzEj3FeVhLnK^V$__&hGj)607WigUe zJ!u60WP>Gv_FH6I#?ZHti??F|h}mAbi_a&~{Eviw1l^WrRkyHBXU*4_S*lw&!` zqd0j?GyeE*N7V+_T<6}zZm_dlpvMI-*phsOheoU|OFCUfa_x|4rqIC1r ze<$u7AJes%_zPN)?N%jb3B~h0OP>(->}9wXjR_GRwj=uxaR0u%2`Wj*lD$q$gv`9T zADBp76?DiM8`zj`_D&Ak;Sgu%f?~H@HsQwWB5Mj)l?+KUN~fPvqc^V!lQv-*$ucr6 zwIog~-dHghAu-V524@^dZpr=dVL+4XGUTyi+*cxmka!~wOdROQsq-^68@IBR>DCdk|B*dWAsub>Ctbi&P*TtVjPsn}yc@2H45wPac zT9Sw3ooinI8bhuguhW5OI43y=1xNs9kOVDyj}slS(3*usx#F78!K#k<_vQW~Y`ezYeQydFkQ_wCRfj~Ghx$lq6 z-f2;CALY~RWGw#L25m=v^rK3>R6AJDefhdll;^c6XIQrFbB1s!+z|$oAIEqSe{K1g}~?~&=MhtRMZXFr9hvTja!S>{I0FAL#BpK?`0l@$C!u(lL+hGV}^L26GA zOY&H~bIlrFqxC+M;i<6kv?};mIuD2!cn)Nd_du{bbC#hzjVB{waWy{gK{-fm9v)Pb za}LVWIk1inEk^_;8*>@_v`^4}n*QCzVz$DCM`sfcq)~>WrJ&UH9tfjZ$oF;=+3ACapNiWu?t1gd&Aw?^qY3a$&{*$NiRrSFBow6i&l-r2>9BT)2?Z zkGVQRwE}460=%>XtG~NbB@c`$pwXp^|GgaSl(dpkg1q}Kd%V%|y~p}fXfJMa2kv0q zl6FO4G_SJcoM#bt%!);IB!Zx_Emj?*#!UrJP$-)-VoZ!4SiW2Wu5ImQ zuz1u0m5s_;`{^>ItM#6_PC?=8Bo|J|ubdzQHqa%tO0y^V#ri!@leYLpTmIM8)0(6vMis-E&e$2w=|;Y zkG8Noa`J!x;(6fQW@c$r%Fn0|OpjGPK3!4MYKY|(PRa=2;o8t&MP}PY{IcpGZj9_g z)70ITZZzk6s-x|45xL7B$)#a5mlaR4uOSDXMt08t(P_5(`J2oFsTa>5(-me00s59A z;?b5L{jvgT!af$nqbRI2wBUXM%U$apu8@arEcfB%a<^HXEEoqlmoCbWC3RZRz=S~^ zqdan5-$GwLk7-43KHTCHPBuGisdQ?uo-CDdrBN!W<16(SN~Pv5oW~brE~jEA#^QUI zzCj4h?zI?71-`HVmVnndKWpXDhQ&GKtRJ8mt?3~yG?>Dz{HB|5zi!d5cyE!K6lL+t zajLfDHW{6m_@^ho#`iX@R2`3*fFccgW^KP3GyUXZnO@PREWHt)mFsz6xEWD)7+9X~ zc`^S&Pe^DEl@lfrGDh#s65&9 zo^jVQh4+fy_{HT!YUDWS4u1kl&}C$#cHP_2qh$@u>QJ4(Dt^-LxS=|(i*FoDhQA_N zAVz%fa%{!L?e4!zv)|erjCLLfT+<>t&|3PcBQtJf0A(Z6W{kpcRLG`y7^?^G!U|}p z_ur6Vu=^d8Ze^Ou^;39OddoBg$n>#MLNz(`lTW--Mokt>cAuO<(v*A{p@rkag5CT& ztrW3>Qe4t0u~wEwbFgpj6Qkuh5=q+oi4%NZ+R{b|0k{8<=Kstw(C!_L1lD{+;awAKHh^ADZv5T?rQKff!hC6$h zsJdeJiNW7O7MVGcEBf@2g@eszD(BLA8e>|F7ppy=u62+`?c*0vfBY3CX=#8)0mAtJ zc+SPH@B8ihdg|^n9L80Zv;z?)fmlzKpTP-H_8KxMY~~g+<~6ia_;xHm2qKk}JhuyS zzOh|0Uod8M2dKPZX8Z9B@+RLXc5|)JKwylDUsp(CF;@I-p1gjBru8(?GS~0Lz0D`d z`Glc(U#P>OlFAtL9(`8G)T6m5@fV|O!GC`YtvpT@u)2Jf&D|8qzfeg(SCR(OBuSy| z`0W`VDK}YZb|mjMs;^bm&u2|_oi~WPgwOZd?JeD|8sFIOakhUCWc5zXj|0T( zqrpO!>!6IG3;DxRlfrC3DoTr@X|E)WM647Cs>HWn2)!_t{2t@3?ZaCb_r^t?nJqHh zsUQgdj`~TrWZEdhO8v2cu136p_OIs9@<9&V*l#hIM;4Uc-yL|DnP109eW;!I4-kesBudUrzub|WBt*18n2YhEllMyt7N5;KX1CcT9mnc z{kndY?>r0}fw5d3!Q^s!xX8bkp>ia26Q%OJqa?p0nj3@n%B{;*No_cAWl?U@@~$9s zV^i{GVoWY%@9)v`7rWKZn!8pC6bXnbFs(uYm|4G^bxB)j_551VfNXL9z|nO@PJZ>e zhA-*Mk5dS32AWJgw^UNmR+2~n+OPXs(F?dmRXnW0=0(U{tRAB7X8!K(|1vqcK5NR* zu+yM)^d~w(#Q#btB=F05p~97x@^Q+p)6iiB9z7$t2hWTVNh2KNt46JH z=#n@lDf4B&!?TgY!q7W$QJBUIY za1Qs!t*o^S+r7i5#&;+A%ezy8CR)ift_&C3>g{D1zG9axiRZ%WcE1Orn<~=zBfoQ+ z6#S4`OO`2(5{f@Wq>O`@rT@PiMdx;6#o2>rTA zYd7(sXV6{}dlKMXSR>x6x;?|?r|0kbsr07ni9?%kcFvmdh#_X2oY6o_=f%NQ z4Y4)jm}B~@=VNY!gYzMrvo*u>Qoy}|d;R+^5|lG2~3Em5_x z8B%%DmEgI3@;Nfc;B!p;_r%n{$&;T*riQ$D)W@EgYGyqZ;a7M6_I7fj*U)PBKW&^2)m0vk8XivfDB_K$h5 z_hR!sQdP{v6qRIM|vwz}fKXu77@i*jec|yh4 zWtXWek0sg4ACR?9g#%5Mej-4+{u~|(YA>|xiTEA1yz_|X5CoL*=JSJ2t_W zj3K^oPX{UGqe6EEg&T8sV~?`B=d&kYO=Np&}faw4JFMxMf7*QWBjOH-#Jumd=bVObu z4>9dM<(;7T{`C>g)?r1f{hK*ed-Ju|_%`(~VY$xBgDGRb@R1YgFuCQvpro9aW|uhV zS?v#sXVnn|QLlclTN^4W?7&OaY*-)Lwjd!YeQs9GL7DU{{;*SHwT*m&RoJRD?!#uR ztVT;V3BJ ztxRcAS%bmjJd%B|RgF(NrTkl&ER{^)ub1oWcLpd!r-+#`L-Up;^xlB zXxghLkK7MFZfJpQtNE|pZcLH{1Sa3F_H1x{(A?m+__I@j4F*tn%#tx)%Sy>2sIn2i z=ixv7=qhVEt7Be7TIeW-;R?;iw)Vygo{P8BX~7Wtq!bqz<$OeTgH>`9&cv<}_Cobx*V?BeN=a3hlp_ zG)R(>SkVmAH8__vbT2Vv+1Rjbj94v2*tS*j&BxMKxdpXg0inD@3!d(y0(UNwcg+)0N2`5VMSYL!gL9@I zPXV_$pn4EJ?yZFiE=)Xmg@%3d5VC3h1zT^Xrecv{QeQBU^Ub4gV^SaE zJQ!!5-+l7P?>8V&&8Xh4`rseigS&~Dde-DXU}`d1EX$Q(t2|16YL=cMx|R50n3rZi zh%kD!tb&(DDXl3)TN}g?9)2DmVV&vY{O? zE5A23mw6#pTvswCe!hzaXzV!)T)IWo$2&X2ea&YB1N%!cDZeuP0$xiqg=rR z2_ktx#u_ffC#@cZg#|0l@C}~A^;q7gg>QAqUBSiEfzdHWH!vDD>xtzTk=*{GUB%VI zlAZfqQ^d--oO&HY-rHiIPC7`-*sdP0T&&i;eJZ6yxPm(}K=PfCxdF}|p!S)Zt>ZxC z^O3X2S9MY_wfG83+Tny;)G8K?EMQaR_G|Nx;NqodJ&ng?e3Gcx6d9HkKB$@}pTpB| zt#Mz6=y^IR{z+AwzR(jEztFpN6E|)%B%8WHYSnf1v$Y!wZxAn*nr?@KP_ z-!D{dVNN5kefN1EuOIq#yo`rk(bExjt#iZ{UUILu0H$f9FAr-;zfU(Y~HWh|G) zjOk|PQ4`9XSQ|-FYh4#p)zXwVB6Uc4v6YIv#cs>m%yN2lO9Y%IzY@OsliG@PnQe_g z48%t5jjgonZJxD!9MNw?2wH*zg5`v9#i- z7hlQC(p@Ti$``Fb5Jdv|sxJP{*)O52WwHC_u|}ltc=)8nhqNBW%l;vd7NEc z9n{I!aZ0&Nh94Wje?eFpi-0q09wk5cKgfw5_k>3%pk)8^pDFjV`>NKKNO~W+OErx9b8}fmnA_?eK0w)j{!-PO zn0)$6{ksU?U-3F!YC`M-PSPC)}j{`V)ZrL>ED zA;qqIK(TptEnjUZr{7^OQOXntB%bx0IkSsq&6-X}j}FosZ@fkO_PwKitq-ijMIgF- zEyY%!9j-==(wZzkGt)iv&M3K+OLj8vQ1a<7(%{C8XCXS_x*Am}n*W@y2M0NXKHf(=@(7)8umjzOGRg6^-8TZfwmd zZ~Lep>r2LRGp4fuw4^?nxttbnlWeU|u2YrRN*B9p_VDQg0{nNmlEe7+NTG}>H2H63#YhE^RzCvrg_K3aqusXAm;uK8@0c?+ zxit8geMy%zFWVON(n@8FjoFt$M+9ukv}v?(K?~m%SfDrGe49n*UP`AkMIYD*0Reuy zRO05wn2~aKZ=>u_zFV_SOT6@5$}ZVV`SyXD)mg8K(mbmfyYB|p1da8)!vx5V#8G)kJLOGn9Y%VVtyIXggmVyYy-*o^bczGSK#)V1BVqEYr$ zrm^2*c|IL2^%eKMk{Scs+1bQm^(uI!yjPFdh+k_dL_z$CsU0A5RyOr~g_&9*T~AXt1w;CPyG zRH4Z|E$S4Dj|k`&yg1NsV7#qgN-xIZwtO??%c>^E#@ppDt$w4u5=ApjFP1Onmhx?0 zJQmZNhEl1yw158rdhOLWY2W_p&kB`=gv}}uh+S|sMN$i^Ie|8VVs6UGg6E z!{_{^zd%$WntaDXN-w>dlFxsu3f}$c@|2F{^q$%8rglCZtap>MOp-BI?%me0Q-qTa z%Ob@}DoOI>4sRXXy>uh7%#5YZ_(?kdv*UlUye50XQMTDvQ2=`NN*NKo#k;`Sk^Ny~ ziBeWW>es0CFrk%t@mm{SOBt_jnTfP_zYnsgd~NUzp22*ZQ;BCUTWD6Ill{wSevzdz ziz+$7LcEAi{^0%6r*3Mx#3}8U9VsT8TAb7QwTH^YSmV{% zkKhr7C7=Tdf8k_ZeoEYYc}=>tEnmx*x;QwPZ>sl&FSi<6UI!?iIkn61eW_FKR-ZXz zI^Q&uq1}64r`KM4gC9j$!-KaC4(q8CXzQfJmA6mbPXIjRpZpo+wme+(NTaVlO!CO1 zT+f*`ue;V2W=^`D;#+@65q{uyn3q)3Ji2P$MYN!~PlZ(Ru|gt-R2hjL;%ym$?byrv z)=o5*j^~mlr<}_cE$@|+?eg+sX7WvW@vpwLHj!|pd`>cXTz|0)CrWsdA$~PN-8b>7 z2$k5p!d{jns4uUmwqq~f@V5KNYjh}gnC}>Grq0B4y>r}nm&oMwyeTILT)iB?i$&`; zZmp4GlUVsj#imrM^-4hMz^qLH@r=a>1h{wlL_2QX`r~6}o<_Xuyt!@GTK;Re)d#U7 zgfap;AjlU}zHGeMec86cQ`7iVx9rO)Z`s#vDdUy3k=21U=T>&@(GGAZh(^*`5dJ`^NE^Vn>kX?N8fs$GACTc z-^J2@;zqIyd>WrFm3N`Xcl|8zO&O^Htvp+I)!d8d+V1zz^jL>6F~hQssUoc8?rd+Q zF6N7fQc)-=V#EekP)fmKo@7gT8K8$RlBCJvz%1&+n(|uxcw_YtpJHyyYkXoX7VJyQ zc@DjmRPW_#ET$fZjuej4&LgkVuMfOTZ}VyLWUQH{Cui{uK5hJfb$$T7)WM4tw&Gs> zD*&@&o2Jj~^qL}diMTA;svG^#SR_^xs`?(0PpJsDYD^$c+4~N@vwO$zYDb*Wq#Zl=@GR$>rNPElgte~-MEjRe?Ci^Y6;ri>$^PiuRCw)}aj;s|9pg80 za0ew{_%@}N-FQr1*b=e}FQep(_fq8T7edoCc|*!4@@&4W?V@Qin9E{Jb-b2< zwSG?2_+A1p*fsX zo%gK>v|-qNJ7AU4?UorF?4J4ldV>xp76&BxQcI?{NV?sX8By`iNyW6Hoi(xvL&`h+ zEY5bC&a<3ZeirA>U9ZxP9lQ0;^HJ@UzG=Mhm(dDNS=()sX+F!-?6$0>f8`4=K4kG$x~&6+ zicB*LDv6S2AD<+)W}xum&{9J`Y+cEw1f6g~KP^6CK<`xFx@{-lwf@#nW9-$9Kq%X(MeQZ<}$|r0a21#2f#}rA8_e#YVd3)LZl=!!_H}!l(y6juuZ>Ha-SB~tW z*N(o)vzF7SD>++FjjIDIw51&?Tsc)mvy@hkY9`*~;9^Ci?8?nXLeS+Wm}p31q7}=Y zymrzERCAn>;+!sbtMgj7C00(t4MD=vUyEqRks>-qX!0Me)16v3qVY%$kXBy;GRWAO zNBt6VICecevf=6S{gp-1b^+17NM!1*$4ls~i6mMQlqahS56Q!y%AByS!+1YS<9 zA31WAezSFl&T`7zhp^O%K(dJv*M6u@mDje~!j6|Hd;j-pTj_CXi@*G@e61!w?x^d8 z<5-0wYjD+vD7NFLybjd*fCbT7=0zycF*{bM+C{1EH*~j z*74Z-Q4uJqrp!<~DJNcuGW@2Vorm|(*26pWtv&6DE?UsGm>;U{T_zwR(fYJ?$^k=! zpn72^UN{;%8;iY|*m9b06TLF(((@}Z%3|8-)h7mJL$;CFL?!3|e#fu9weJim###Z%Z{= zpB+%RfVqK4zVv3X^{bs%-uf)sc;#hZ>{{De>Ex47q*bdIwuxhwY zTzMNgU9)OfWBsbieC;!QF!WC4)h~=v%{*(9eDX7NuX=cQ{r<=dW5EzcrUZs-wl zDc4^%@r^w)d)blfWGB)tZa>Fp;x?alPwSQNxlU<@*(^q*=^Bi-P(Dna#v>3_h&~I&YT{KUvyoFS~Pl7@{j(6^3Ogo zx5Ho^NKUFYF)poqqYajVJs*r{)jS02SS;ndFgUW1zXnoX2l>*WZFG=`tB z&J4bJD5rw+#TU2H;loFYRbZpC1d=y>f+(J-tW!UF%VsG3jnDfrGL0$u%g<9*o~y}s zFo$~K_6@H71WmjDW4>%=7eAutI(}4<%w)ehA{M!e}cU_%YZ^TrO0c$a+fX=3J5Uj3Xd4{6tIPW86cwq&9C_^2-d?n${JXvlR+ z#|TaSI~(z?q56i7+ARSYXygkli)_mbq)pRdK?Wi(Uu>+cY?m)KT?d0QpJF3vHedE_ zJ+eL8BGuaKIHh{)*Upd@{guUM{F=6iUx`1NOwg*8C(_A$T7BovSLylZU($!ck5(_z zCr%)?@-&K`a>m392CzitzOR$}<{sZh9yzp!63>5~GAG^Y+ZZbqSgz*`%FpA!J$`V# zUzWHNqf2I;L+_o#H!L}El{GSs$xS;}Y>H4aixE1qEn}68U%GfhuBLHGLkNK zB7|g2^@x9|$icB!WEq z*nVUuJ;%?z+?Rca#pP@|q2nZ)7U4$|@sG6^52l2q+TheJkLe~F|>);*BPwSIokmkwSFf({1l`GOhOjgw>+sMtT7Lqu{;u``ZX~<)Q zCPxdQ>6wZdnx<9zn=`HnwCjE`}dSx_#SebXV$dddQ^6l--F(I-?gkAO2VWbaY&tO+gH;2 zd#DZQW+^#TG(967h^2jH#KmA#Ku1|8~RS}AkSWIr5E@&$~W}PZkkI2ZOhmP zzpI56fqguY)Tg>lE9TSLx)uQ`r?$zj0}z!>5l39HSwJycwv!e^XPgko|KGSiS>T zd_q9Jgyp{ymh6|`n4{bBh4kJARBkWZwv63Y`!ZWS{my2x9%55ow{c?X=KsYOZ9N+q zOUh?3#gEv?;4A};>>J-^ZQ|F^Ox$c^(n|T_v$?5B-#WBv2+rj_951rX)Tm zLLh$0jTAfmf{7FftZnA2e@ca|&-p%nr;ww_;C{;WZt{JsQw`AN8%&(s5sJRKWvZ?w zU0z-r`MdLPr_Fq`kG$cB<%;pe7lotq(}E{VF4GT`7Mj6uVsK* zqHSgjRtHkc5Kru{e4n>D1Z(4AF#E+=jJPy*CLC#zEVi5qOi3sU%+g`LP{SP}KCL0v^(9~j z5s5;#y+Kj7%k#>kEKj#~cCB_iSU6=j|FEZG@$#}|iTY(9DNp@+|SE z%lTCKxq6w8oz3GxkjEnLW*v@5Peb$AC_geL%B-F&b~aNrmKoeM-(Cx;MxuH+&)z|9 z$5a_vZF#P&IR1%B8d{zWWqd4~O*MW?og@~T_m3u(dDo_y(sEix8aVJCL7=ogf~sIrvG4=pRE)?SP8hgaMy zX9fW)42yo$uH;(<=8!ZkUi>K5Ap=W!1)hbJFF$oI$s@&IbjTac%}umn!>M%o>8o{i z^T}WSinedxRc?Z9CJ zflDay!o3uItGbsqtY}?AA4uIq1I>NR#@zHG6y5Fmzac)XMmhksRdy zE&eC{p$>)!Q$xn&vW57vb$i<;J|S+nn3+~7fyGY*hHJ?oLX&%T0A1#%?lQ5I3p^EF zoGfd*6t~OLB(IpxUsfXo%gfl(W^HZlTE5@q*HxPG<{mNmvRgY-PpPi*5M*0ykBxtL zc@tN;PmQV+u8ue5@eH>u-=99clg>Z?EIRMJGg)jtPme#ogNeW(`U{j~p;`9lS+V+@Bd=5Pxqqbe$~!9N)31*5Gf(38 zpkK!CLH~ZmLQL|V)z{3vjIN(|ImJn4_jutC6*k&qlA@`mPTrI;%3LQY*Lr(-ywX`p zPAQIIyd`5PEK9g_|UbAN|^@y_%Kz85V$8igPX_gO=7~iWJLuySi`V zv1ulL9_)G1u`QpQrH^O(QPad+li1>-eqqJuAN?N;S746#fDn0V(Q}pb! zFE-ZALrv2tam@!TqEN33Z@)&lfBRb1+SvNu^C_`>A?4Z+($S08(6k>sUX{8;Xl54i zuaZt_}1-K21KGA6F!^gyxj3j88hM@y7_;JWhzM zEHVQrH>}v_X!0neWmNs>0LPBRmu{OeNCz7oH%+>TB{LJsbxCn?EaRiu(s4`clG#*m zypyp^9E)GwmO`BLM&>Pgg2m;Q1J6@ed^Rm;J&9%{=4ia^-NeRzrHpvcMK{d&sWYYG zS8QbM`IqXn3jUB>iKBcO(mu(uZMX3i>);J;n~9(8%&zC#^UG&RNb-zhOA6^Q)g;X%!-?AD;HF7Z;HF8ktK{d(VWiPI#P z{K~%gm9o~Y^<&bEtxZ!0T1dvOQY<6cmY0!jZLr{b>t=1`s;n&H{o-zfC8%o=63KZlf85coZ;W zKyhs1vBW!Fu49AE_r?toN@nrOi-@x4!PSR%vk!|=9hcZx$2%QtSgdj}taAHIFyMk@_{2Xo_A6AZ^fW{t!W^?JO4O1e0jeRnW`0 zE%ouD_Uu7+blb#HtV2O~F=+i#iD%44W~P%1$~NcgRjiz^CgM`-G5NfU#Sa9AY02WF zjJg+Zn#u3~`@j4UBVrgzK)zh|CLg_7hO;G2er2)SvR8gHjj=U$Cf&1@;ehW7Kc>8` zNAu)AjmAd(d-hs}E3)wv>-OS_MoWH&)^Fm_=X^^2Bg8Ll5x>PYc>ik^+hQ7T8@p0H z)|a)jvB_gSbYLr%=W7-D%|iquT&L7{6ydR4duGmH^i)F ze)@?Nf8{?}w7)Zi!B{&Tu{Qch>Q?&w{{Nr7HvzY-s?J5nK4+i)oT^iO6;(wwKta*> zJ&JvYnkf3j-WXA%NsKXhe(CPJiMe_A-Xz}S-Q?vZUlb!^2Z*AGg3<^g*q}yGKza%& zs&7u;z5oBm9BZw;s|u<)yJ}al<~eK4ImaB`oNKMQ{ykRrAzOqm-SAjvA^=H66$n|F z9PoMB>!~be3K3XF3kv!N4S${-JgJN}(bIgC7{uxPQj{E_e5wZ{^H7VX^`o2Y)(v;s zl}~=d){bnm{7=B1b2)*vd;?8&>ZJgZ z+t0U6B70-GZiW$PpRs7wKW*Fah%QxR5zW@2ffWt-ZQcwWKB#@*0Tw9^w&H7zqFrot zyp#)49GFhy5spI>jg;4-L)tBom%vUFOo1M{AR+MpbS{<4hR)1ZFhBv#QZ7>NzxzRY z*k?J~>-~><(H8lc!bZ{m8l9<6C*XaYC!Ms~)~(xUx8MFl`{56NW%$Az86DK+(*KaiusCp(8dwHyqD3- zO+T?U!_V0A?xXC&`LDOmmQHGwjOMT;4@Dl`qm2TM4xmbBvGS+HQBcZ#;fSzbAkzor zbenoY-pOJ>8*?vHj^pd{qWw?W8P8c(|X)(8>go5t4Nb7HwZpd&y`2?y5Gi7cYo*SF+6Y~D8=P|r%^JB$Di zt{oO|6=?*8JgkEjKrZTN5O54&=yU?UJYorPmrpc067oCCLs#%op8A5mGa1tA+a;fX zXUKSeYVEu3+~1w)avFK4bw~Noubk1+#Ms;0W5*r4%3gTkIW}ibziryI1@GkC?n(~Q zb@j9tSlb(Z`ylmx&)gorbor#r7nRMzwK%aD0?A(M~~W@CDU1hrElk%}XlS=7}wcUfyM& zU-MOaY-pn$-o46BnR%|wYhPqld~ZE?!@PhYMb#JA7Bo#^$=}qH$%mT`a;X4`1CwW( zDKT5YxMrI>`281UJ={$0J~S3uN#4wJV{nrvr8=#N%ef1^w1D= zpK$Uck#zz;>BSK$wV-96u}rjFo?tT9C%NQ{Y=Iyf0=`nKRbt5rg;MBd9_47J&LX|u zfASS&SoS_8K)Mro2iIYtR=xxG;hlT#>2?7wt3UYQqjt+JciK;Xc8`sZA7o!1s#dM- zZMzp8%17cLEe#La=okOFVa`_<&9fQrdBZOC4_thK^?d0zYkj6Mw_kMr^q+0~@R!9qm&N0$C0PzuNw5 zyM5!2?16#DaB2K#d*Phd;ggWPuu6a66{DwgW{QD>iOim~sKM2fB^;tp@{c4e(VHld zC?6;j&LNMv()+{~a;22!QL=|l;%kk&51pG&Dt&y|U)SNfol#>1MU<5;chGI2?01~f z5L=TEVLwr%9}0YQ=t%Oj#=iHVwz0rh7WexIV3Vx~qZ!b|Ua~xhW!_vPPy|m!&va}S z2tJ|mfW_gK%^-0Q^H}yaF`(=dLORAp#Hz?6J+3PNTBbMnQy#h_FE-PadVtFIdfuY{ zAz!2w`J-HHXE~ywMR})tRF~!YKDsY15qgh2a=G!noZGh#*!RA7m)(lxV7ZsG9p5u= zS-3QY;E>KoulbZsZQjtZKKB3dZ&{_Yeb@RC)!g>}S6TmGeSX(G`_NJu+F%{O_>>Kw z{Na7ja&U-F_ARy1)o-`=R)5WnF*!Mh@BN)AsQJ`@xo<*e$sK zvJGD)TGeyBy?)V!@{9iK(mZOKm*h7sB;#zyAN}xmVA3bvY?-4y9|OO%jaHYHOz5OO zlBtvOq&uI_b+X{?&Y4)jhd(Cr#jOc^B42)!PQOuCkT-#J2_zZuNd@fDe$c6xRm##S z_S2iisOpWu{jv=2G7Y5NovNK3go;3H7Llo`;(23w(xf55#f9jG4xpAeji z<4UQP7E~U)UXENxX_8^41G`w~ftqB3tb;hw*~Ipk(1JH|=`6^L4h8YhkGF^B+rB~aL^Xh$B88NpHu;4YhQwK}4%7$;QzqjX(8PC7mzSI9Ky8v;+l|SP9GuMb z3o^0upd%pSq`(6%cr`)!k-JmHYzp3;F+@ATs-4txtd2o{F}KfsASm$|=dr59W0!M60!1FN z1h^sc$mrk<)aGP>JfxVJeH4p1C~Rve8=R2YdwL zpyt7(1s*YHN|_F95q7b1+1kd?Tcn2GB8}ysOOFowoP$1aVhNrae$X>Jng2O&$WVTV zR3OPlbT%<&dJBS~uRu~U=*;VF1+Az)<1hFhK2ZL!Mf2^Q?|7qKa>?uMw%dMaH{AF= zd-TyY^=9{bz4fRQta{!n_PgB!VQ}K!AKUm3Z*G|B&a+Rlt{0!R+xkb&S#2Yy9AO=I zKe*d6d%{?K{AR1JMV}Ys4<+r1{K3FGAGqO9Hkw^Bd5&4{2yn=F0x%9d*oOd-L?k>; zeI6kA@p*_mqUlIa?L3b0$CS%+UUMp^ni~0nZfOMrbwZ77I-qrVM*N-_dD_0S;dZ=S z{TFz!=O{b7|JBxCor5NTO8{2l-?&^&A2^55a`;czSSC1hT0|J>zt33mG5pN>?fqlV ziaH6BIbYFmL^7itR2ox;6V5mJe*i~0;oxxJPOey$^?Jdsjr7#wu>L~nf*j7`k&l~_2>4# z;68Nw9M{p&fzMo?Z!de<1$O`a58L(My4mi$^X>!l@DMuF{_f|;_sn@IZuGN%$IaZZ zH0w{_zsI__efYK3@m@q(8+!Wf&bqbPY;Ehrni%bFY2v3@EFU?t`}^ zTgfkvPQrsU7Fo0sI+ZAtIqlxkZJ*cJJ=dBsMKy^_Eys~`EV4uYStnhgUldW-Si9rS zEFEA5sFrL-bp;x?uunF$%YW)-l07y+bE45sK7L@4eP{w*qa;4}L^`N6$*Nwinqma7 z-*pmO!kMQ9G{>eYE6Od^6x*i8iFzOvjRBrGfvBv*H(EU}%96s#Bji*`>_xtvm1To7 z02D|bwlonX`N(!ATcj0*g8pp&hu+9#JA5cO5W1qh$j>ruWOgXeu`0;d^Ru4ojMiEa ziDQ-Nh0fK-9BId{KGL@0wMaMI@ICw1w{Nu#8*t{_PpR$2zhNyaR_`Zk2iDB^cfVqj zk2dZ;*`C+F$U06rW{*2LcI@Fc^wLxC#h|=S~fjk?GIdIqet!fDfr#d(@Z=s z!|R;??{#J?(j5>JI6V3La*~%u`TC-XQ5<~ku`X$|9P=K*1s48Do#3V4bX>>N=y81V z9z-TZGkFP{(;5BB_zHb~6UB}xE=5($j5##F%tvJsE|i_vM&ke%hXUq@&zsK zr^NF)mb`v1snf`p`Gw2o92@z;hB7tH2spM(K(jJ2d05kURyvZ6Kuk;-p{@`IT9E7O zqz5f>>C_SK6T|M>;9L>OCxwD;PBtLMeVkF=UEQI#XhRbg8p7}3q0XY-C`TTAk%xTb zqNff7O_SwL{iprVv|}Ff(Zc%7nKSIoZ+@*7MmMkf=1sW&gdeu=8(Dc0z;gv*8 z(hK|2EPL)J=MuLjHW7V#!5WS1lgoR1_@)}#sJAw8E_8cr3VHI7Gq1Cs*dIk?136Nr zGBnr7vyymdmsN@9RTt+z)6Tl<7b$w6VyE zMNdoXKzAOe@p6t&2%#fHS=V1d(CnlAGu~2}V6VtLh z{2?uDL>@HuDN?jW4xvo0$g`vW(ds$nW2tTNT8uT_5Y9BGwu?Vt);DXKwKk`^(X0Q}Y}@9BIoJ1&*IC<&#e1!PV#!<^{LOQ%=gYV4 zwT@>KY#G^%&tCqkjhu?FJ{^Rq4}j(4xDWGpunF66ybF$}xk(rUeTw6h(85~rYN_!N z%~7lh>VT2QcL15J915s|?bMt2nESueIdr7C7PJWf)hMtHBOC38jkno%H{4CEkj8u}$$gWTxXyW9E z!S5uiTLUOVs^s%Fd6#sur%V~(q>iLlHrbezW`2NM+d@92p3*)1C5x;`tHeoX{}M$_ zSV4?gs0jhVfzR2DC{wwGPJx8ett+~m`b+W5D= z)G(hb-CfrI`|sFi{oCL3a_jo~53OZrWS@2IOhLzeU$U{I-e{A3%XZe>lr$U$_V%r2 z{}r!1ozM5NlYoU0%t;_F9y7pHO1#~V4TLjO_}rx4VgZn$d4p8QNgM@TW~VR`k2S)a z`iFJ=xa7P;IUdg_P>Ez59A#x_`03Vr?Yi|h*+WB5+wnbT*qi2m2=Bne7ki+9fBp|A zsX{u{L>1C69#-UNZdb8S+LogM$WTu@DU!SbMG#y~q$`mXiTz=uRpv$WKBQ*(z)Shb zOpOlqKl(t1DMSTxJ+43eiMMc2FXjB+P;hJfU|;fRl>(QgO(tU4%z@-1^->T2{WbvF zryjH<=jq!RK;_uvsKBLeiIB#$(soNmz$;&)TI4Is%`pNATRPCRDWT5h@T~NregtZP z87E3EIaic@LUlS1*y0010%9?fgQdtziCl-v7imEW8Mp6#INwg32_fV~|LbLo@}WOO zi}j)omvOG32XEv>y*`QMK$JYSd|@#khn%we{%3=jgo`%lLuY4)y%z7}eEsWQX7}84 zzkTJa-?Ce8y>p))9_o1K$DSwOGdDZ{^!K=~>X#>r+h@AU{lD`TYnj`>&*~;;_1eHY zUSxg$di_4@+NlD()}`~upR~aX8~5PRPVMd`@hrRn>~EhjJB7GAriuhCsFEbVWX>8= zfk*c#wsat>IRtVMBsr_taXjP@46KBFafud!Wahyfxik_$Q78Np!eWJ08FCIXPz-;Zvm&V;ZBh-3Y7Qb~ zQr+it9|N{JaP>aLJV9B}HsN;DE!j!X{Q81BbqxtO?REBI1U1wS~Z@Roi)$?tJ+ z`XGy${-Ru2Zk7>nY$>3LU15%Iwq|jz^rJWe^}vX2oJ8WO@+ik-BmQ*w1=wNk(?cBg zoJ@*V@^Z+KQY_~jwWY8d)Ox+tQLl$G5rK?y=n;SBziX|RCv|7EdV26g?%HbCJ|X9{ zdS2G+Y3_4Afa-Hn#BxlpAxBzq{7*RH7(4N#V{P;1EsAh{^=sd@XP()!FWj`A`66pQ zVfSCbllSo8D~3{7ap{|;P5;0p7h3mK-?!Ec2;(&%RoC2ZtxsW0 z7U5MuO_~-Va`~6or7wvg;Ne1az*H?kW*6Kf|c)upv{8-`!g(fxS5ckluG+PWL;-tCXr@!ew~pDAgZm`o0#jfXy2JfVR<>T#J@@{rTq=9EfssYo#ZDVGiEmtQbN`@tj2SRrv6 zYG9Q4IP&hw(TQOjo)}R+ipXU#Rj{pFCIL$-RRK(m4En>!D?7258O3jhE>07*naRBE|LG%G-zv6D5Qug_bLI4MjZg2NyVL0M}nZa;6uq>IF3Tse;L ztQ-Yz(m_rg0Z2LF)U)^mOnt79a~)-(E*k}*B0bEIR$vjCwu(u9VDb(5ESFEt8?=z4 z3@4TFpY(d3s7LNH_5O#(eB5$MqSbX^Xa3Vhu!X%EzGzI!-Iv^F@`ha4pFO+Z-u2Fl zwS4ckyX>l~zG*-D@z0}qmwBbV-8$a(`@3vEq#7p1J(}6TPW6BE-B#(IzBjy0;j@+7 z-}?%i`9HqgFs~Wa9C*zc*um0;sfJnFGsPX4Lw*-8T=*j_Jwh8vKF%>b+*wXJ4;#)q zSqeI_TF~)e5Wj&gFbQDe0K^3oyNgS&3-NdpA6gXE6liS0>xdA&-1t5F+J^5~x6QLt zd(X2o7ra@#{_e{p#p50G4?jJgYjVJp`6a77u9NqvGd%W5%zcZFP$&Au5H3k9BNJy* zBHdc$dgD^M^kJ3jrI}Pi9^=D-qfU;L<}H*NZO!Fa@}ze5GXYcrUk9|*z_B22URH^` zjwI=T_?WXZ4nW;5WgS=!+VD65CO>e&9(!srJn%Kuh94JLupevAq}TGFd}&+D0<ir{NNLIT*k(DgA+C!o{nv+R;}7rRZbcYP6E;l z%xD5)OH4*yF4lEG*YM@MnVvd%$-vIe(ynAkk4e8M=hK)^df~t3jyjt~y_Apoj{aln zN&Shu$j`Fdaht3c)2?KS^df)Je<;@dWWgIbC*Z7{grgq*^GC#sE^PMTlI0gzo!AIb<4xne*cv=dh}ZwpndODUbG#rE5g&{%XtNqhZq;4g8Ce!0^U$F z>pXOE7%69+_h2fn#t0$qldRy z+=F>s_Zjwv*@#|N7`-I0Dk5UnOFc@;U9S_M8;FM%6kYQ|;`MIv_;&fko7L$wmgJ-6 zkF1Skx9RfmiLCg`_0cF6s!ehngXB#n&jAsz1fP$Gi%B#vxE z`^9K#_yANX>zREtjNsv|p@{)3gElli2uj!h5T5F=RxZ39f{{yU=h$;0r#$p>6j5WM zPx2R8^xa#^b@PruF``-CquIRMX&0W2k5Bl$eZ&61L3?|fwY9ZbM@PG{98o|&AbEWH zWJPsxkTQ>@-VEtVkyDPd8}meC7PKN=OlcLoYR}|zj*yqGu*LZ;J(xriecx06lc~(t zTKk-Y86~Fm)K4%JeGLzbw2U|Wq)d_*U!v33xGg|*`Jd}2E&9W?6PbTLPP3`tmpMLimR=j>??*_@4Q@v-+W2nA*O@#;(GX<_%2!fAT*3a`P(%(`p7+ zAGUr7pQilyr>9kIQCY{&{}r!0dX-Ie%q)`kd-+&QLwsG)i{hmUJgf*5BC%YgMLF^U zU))Mg5gw;{D23vPYEJ2OM<@$yx)6`0qAebiXqNCWUabC|O}E)q>u|s9WS^bZdx5=g z!5hHNJ1_lyUxJ(Lkk+wDy|fNHYRHdQP(-Hz>R_{uWl$-h<5}(`d2v&o(L~B15CFOG z&*fb!!J6)?=Oym z6PQmXx&C5Z2QH56ps}ur%V)0uqd;80T&S+3Nt!d#J|v%Hd_t5Os0)8WEqTH>((3EM zpYd=qR3CDH9lBiJYt!d{ZihaEKVh@pU#~|ieNFx6?21HrZnuly_-cFen=Z1S-2Dst z;uo*g=Pq0EJ@ZQY^j+r7y=cDD=$HS+rUte(%(0GBkF}mxo!>D1BQHF`Mvq@+?Z0@m zAvP+b+pOc~|6;>u{GScc|6EFE0ju$|k(c7jK7#7peTfvfL^<-EDI*^eS(td8gn=}P zgQ&v+6{+BHh1VTba0yl^MIi}1;=aVVbo|Kh<95xuZ`sXwvHI$+)9s@E_gi-zKPRd*95;Y*fq~^+04H|o=ad8D?67R^=ux-bFH!!wU;4+>J z=lzvc>#>fhE^NmhL@x29K9U1^XhPozrZcdKHjfBUl&dBh0gq@_-t?w7wchsqhvPy=6FFGAGMyvP1;E+a*=gN9UDnlwUzh2gPrmPw z2e6`hy6lb6v? z-b_C6ay&@mWoD*UM2sk3)Zsqjl!wX4J9A^+X?=)e0^=uf?$ z(a((Tw%{OaLN1L-_}_wl>@a?*uf;ymU+F;G=7C|mdTfDxWv$uT+WY7=CWq2$@`(p+ z=;Lo?IHqCUT6onzSm#+M?2-OE9{=ec@wff-A)EWb|Gh^td&G==c;Gcx*u=~u_DF1B znEAlYZ{Z=IKSvZ3Pm=ph&B)lRaoD4>jD{yoXUa$~AQ`O^pu#TrldFU?Ttw z0omx(nBBbj2Z&yN)3)G@c4qI3?8wgJ1yrW!Fn|j|kMNQ}k3UaN3jwH<);|<$s~Ko~~AZz{u@!O}k;sd+%V(`I1KQP`_-!7fNOJsD&L$V}L0_ zV;M2$$HoY{FB{Oaz-fJ>6Kkl=DVxCIX!L#5sUK ziJ)j#X=id7FBA~q?Z8uKijz(~PmvaF;ZLT&Pzas^NfT>;%Obs4-kDr|dp%Emz36Mm z7HPpxn!qENIDry?W@)G6PktZ2IrHb*rPvIYE;YLek)$s^Wph;&#w>Ey? zj_f$aUex<;>uc=?`~V=4AQcb{QU{)TPq!ami@R8J_C6#MiRF&pdU&C=cx=r z?!PxD_tiq{_{0yG$e-pv0pI9{kAq}b^a09q(WHfqvX$3FDp$=j0u^G+>frcz`Lg!r z*(m$XlcAwutB(oxSc zBXN;5QId}n2xkhk>qh@X3qDRSYEJ~|*39CBLNP=%>4i+lQ;zmM-*q&WN{YOphn>+^ zNs<-v;6M2vGPQjsYuHa>lHrLmQl>u$b$Q6sR*auy+VQ03PSSEbIQu8KYWlGi4mPg< z=)6B3%Ge2i)04*WWsocWp`mW}z2#NbwrW{JZ4{M{uUKG1uRYVczxsnBd0NYzcmIQJ zKkQuWG=6W~bSdw`e)v(ms^|}}bOui5?hLvX8j5=C=Ft}PB2TeQzCxXciQc0LdJ6XG zcp@8BZ9wA}`YQI7mLWU({-4`9U2n7g-Z{G5nwbP6j~#ce;DCx==kY`UgtY)o)(^<3 zjfBua5hVIXV52q5YKOmQ$RdK2*PMfa0)x28hk}D;RLDblDn$dMqLLTE=STX+`Nk7+ z{A&(ik$UAn#cOQ@A4M~9u%YVmu*Y{-ZW-HXn?^Sva=FO{aVr8-TcsDka-Q|I^eb{% z;Z-gIcPJu&C5V>~(BYTFsh5sHmtTy`e`?wKxV8W4^EP_yJEu+g8}S_0e?t^=vEP>GJ6r5e-0`9uIW4msZ9$Jb=;SMw zqn&glHu1`;z$Pj`z}520W|%!NI%?-XJ!rqb3Ew~OdlP`lILtW!BKY93BM<}){L3SJ zek{9g(i1NTIuyklG~{UK!Nrnf2>b|y_|Jn5LJ_f~d~_!4(>DJV%@Y`Oo0QLZ!Qg<2 zrcjnn`tN97^FY|8SW3aGs`TaZP9u@?6|_Ts0{5;GRC3uox(-)87?Q34RL;P%z~)tF z;d1yaP!K7G54w*tUFs*F#!5NI!VRi~qI?9+;hy)I@){yKBSzm6l2kukkN4L#M)Z=k z;3F67%G3C`KB|qebFT19BIT;NMgSO-Z%8d8n$5LYn$nv9o@<`OQz%Hh$CED`pM!-t zpKfRJ35Jt{PXL^VG%;$zNK*$UGu<Pm6sMIYr=-&-xx6*ggPDrc zRos^ud@vL0b0L=0koy}GE1P!hKYJMc0bc^mlwrzz@#>E2)Q4h&%cK*I+LL|0q`!^# zL+w0~?w;iNnfQ_-mvwkx=nJ@y^GjHsM!DJ3)YgqQ`jt;L)Xl#4U2Lrj_x~M3lk;ZS z_Df!9eV5(Xu>N)Y;!`%h@*x_8K4Gdu=R1CuyDruf5)NE8kVp2!xCN`f;zyu%hA zPY&F?=9g;eN+dsaTn{@VJgKOpgB%{0N<1c6fWAag-$6#A9Tt)diWGBD3j2x2!5{ha zy%|H553{d)TfJoDc58RSv8|B?YtW}^cv3edAC~zt0 zNvs+|(7jh^rF?9QWD67|a`-yaAxgPwx)A`z+mvgCl zUNqLq#w13@l;~%qOn2tLx44Zo0TyJ7az!4}LsyX=G`4H9@96SzA_0jOa&J<-ND!B= z<{|L>yUWZzc(~b(h)glcd1n(pJT&?RJkT=am+}hTn6_doBJwjo_?BtYx2K8*-u7ba zx%v)k+1i*sR>lUb<7fYDLudWjp1LOfxwyyoFYu7ryAcuJ;bxQA$9VE*nR&4+4Rvin zW4@d6|B2}3zae`06TAcSyr%~3L-!5iRXLEyaZDiM$07)PI1#rAOyM3w9_Mk$k(GXt zPjgIaU|I5FAQO4~zDDsmNnP?49p>EN4H;ks!AY1`@OZpF)yO%fPClzs0c{e&ipz6) z$75Z`I7m9~84U!N`h$}DMR`I(@>3N#m{6cu zDfQ@O)RHo^%TkO7$w=(4HX1V$+`4BV1kLAoF_f$38v#T#&B};o^KF=e&LaZP#~*)E z3!Ufdl;+_H>3IO3^XJdOgGN0&^odhTG5JIbN`V}pD{}G&aEvk|mz?8v76H{nC6&2S z@={0fDSFlU8ljYEuV^Re#k}5sw(TI39C&vBYi$*ERCr%zD;~@$80O^4CHIzgQ7}eKvl}wRN6PZ*}G$yu(^%?6@yZua#YEo9gYf zZSQ@#&HUt7cFnYpEp5O4nvJZ&W#w5%@3tlc5A6d0mwYGY%y^)T`xAGxNKp=Y^9TtUrtV5FEI=+w3!aQ#NDMpk0WYj9)mIuGjMz;to!IN^VfcF~KGt4ia1}@a$kZ zZ0Aa(l1@l~zIQB-opJ`fTRkd3IjSh;S>5t!7a^8+{QHszp{PEE%M@Ks8WJ+?**_3_gBf(3JJ z;evU{=jlPCdOMnwftEOd1u!Gcfg~mtP4t{|I1PDaP+hvn`rh%nJr|s2iNW7I*LuEqt5u)G4YUnO zQ`Y&Tzq7%Y{p)UNe+hng@O4E;`$xuHhC5iC{38!q)FUri30m;7t)3Qj&Mmt$F^Bd>q6_PuCOC}&hdyPbWn~!)cwydh4b^pvX}f} zIr@kKyMYW;wyQHvW5=B4b@x%u;yGgPtHwvZQyw(}ZEYN{Q-?eO5Bu(*lYFkn<=H?t z*mqA-DGEWSgJk)_W(doS_+$HoWKvLO%`pN~mEJ0L2)<>tOyvkPbOeS0JRf~@jTRar z@LafX9+vrb*rNG($Y_R7v}p4Q(B09*hGOJS&DTNaq*Wi$q#m{hk7hQ`UP!XR`7qT< z3ts99GV`F5M>@L8KySD!RYZLzaBuchSbK z$~}l8@xh^Hcz9_1&Kqs=S9kBq)oG#6`uKbCMI~OuIl!r{)wX@`)i&$TKie=zs?XeQ zZI9h(V~4+Vmo`@7nWVn~z!pxb1Ud+8E=P&X-i##8N`Z~fJpX~)$ z*g9kvBEZh?JPY@Di7JUCs(LekS3o`#PPIn=Xq@{%m>3;iXyBUp0{ zQV=qUMqc_Hb2H1LC4G@mFB5Z@@$rZ;igq!G#}$i?m2!$GxvXr(HVOr3l1^*`ZU%1e zOe{&4S(A(aFlH6Mx$v9P56dQTt90XeFaiXgk38~(7Iv4P%RKC`1->j=U~}foQY15m zf)iZ!zz~Q5+(>7clNu8zpGfsQWO825>-mB|=#kTgCSn>%hIYmqK2VO6V-fhe|3%+i zd-N;xW&R@y+JbvCr3))chJLxB7GLFB3&cGv);~PN7s2nZFAq(Pj@alG|G0-9?-_f? z@kd$D>t4KPLJi~|e(5PTcKJ=#cHa{Xv(oXCf3&g17vR;?Tm`ykI|{jC=VW`qGFWO zvCdYu@X{(#hK^}`p9b$&z%l`PuG4jEt?sZyNG5qwa4-?55M;U51Y%L+*NIZtO#I}~ zK}i325X#Raucx$~mT5wj_dibRz?C!=P$@Mj(RcQpuNiuJAJmR>zSMqp%Q)E<8LaV_j|dwZKLUcAtjEM81;D z7eYQE91Xk3dHm*{?1E`G$;F3yZjAfC5)q%1bZiKMq=W6y zO>DNOh99%1MjjWytW>&eX8Tes$J$A~ufRJk`*KhT0l(kT`#>Ai;r?qBsFht-Vo5fU z2Ve2hvp@Xf{L;aG)yr$F*k6aA>ZA0!W{s-)Pm?)Kn&=z04{f_zQa$F#OY204wCCd& zvWXW}$%Rf-Xht;TK99QZ-VoO5N12*&1c)(t>3rAkO=(82OP`(>BQQETRs%fS+N!p6 z$ziq>_t`C7dYCS|7r%AxlNRSSPGmkI#Xv<{)N69gVmocmCQ;|+3B~~=C&pZVkuA#P z%_c-ls=QCjWpX(YYVGHKbdC>}mZ=^ocL%5EOun#+28I z*V%VJ$f`-SARF}nrO`xsOLw2DxwNLyV5w=0>`S8%_ z7yh@|2)?1&z%=Vm-q%3w`=)y9hhAfI0W^!-dfznGN-qF_`Q(F7*#FTrPvA_3;#?eg zh=dbCFVXZ)ly#Q+5ZY2bA}_FffauE4<_nKG3s z#0&1VEzrhSE=}nz{20&hk@R#mDVL{>T$e^4wj@K_G)o^*P!XEFM5!`0+X!GA@zQw( zm(IDl%2bZP!7~Em;}bQ&lhI9r&gILO+KS~%6!mOv#S5J^A$h-ia>IEE6C0D7>e`(% zU)RfLa)~9xi+r5q<9^a;CoSUvG3umcbm**f0M+3VV8}%-yUAu`Z1bKtrC1K0>CC75 z;i1U~@3HakT{oRB?x3sZjW4(Msp%*oIzpx^;i^N7L$I8$KU+>B6_#M;5== zdRnkg`58Gsdvj;0rxi~F(H>sa^F}-JEm*!V6F)-Q#%;y=K>*Al>tggWWVoXelu!mM zW-^u0*ydEW`uRv4ZoN)kT0qm~+@wt6-hfN!h-~7)AYLLS*bxxYeT^&y*r5-!>vnVu z${!w^$rm(5q*A~QM&uuwB?kWRb!c+CJu&=7q6E5fTpQ{|9bdGZF$#{I0t*aGrh&RpXYKW(zvi*%uy|-pW*I~PvP?T zL&L*%-V+1%-mU)BcgW~CV1+w#rW;2?L9f6Fm1>7aMg*5^?n*xV(s98R{wWekQO(IQ zKMvL6;D%foSQ0ZGac7cwS5$AGT(HCASn5z8o*1wvMjy7vhaa>xqmSVdOOMU%I>Khp zJQwe=yhOl~uNfkLyl#lVm+ls$kM0ILkc>jW$ArEn_W%afSG357aDwghA7ds^EoHuP z9R#%~L6Nhv>;PThQ$%rqFY!n`d4P8L8+;ln%BPFfiB1jlK}LcXG`G&KInl+@hg5e@ zce18){NR1km9hIE__)-FC4XyZWu<9G02mXO&hdJqGL<86h>ZXv2k}((t@X*9<-?YgGe$h}r``(R9luH&g)W&ou zpIA7{2HtqS^?v^5eNuO1*K+&I!~f7OoO!nIBzIRqR>V)nhimTBbX#s$zs`6(y9&vvo$~lo69F9REDui(DO&mH@B{YL*yA?Y)@}2< zSK;j#7ud?KWe)Vfr#mb$_xL=(2Z9pVgPloTHs+i_Ms}E%C?i48*&U~VoY&Rhd>IdP z(68_>`sO*MqYV_Pq;lU*tcr+&_ce4$NP3}Ky5+r$rU)|W@;a$-*Xf+6%-7t$I>KJk zU&+!-f@V1&jih+1msCx>>>~}t+{!k}Y8<5}m(Cq=cgppF9|3Hgj>=(+&$t_flMlQ* zr3d8*?7tD<e;o}1&JR5)%1Pcv*PENC}v_m=;Mlg#x%UL@s2RJ>~ z!$VV}!#4EMH`vt1bq({hWk#h3U#zQ4|3dhgc`8k*S1Zhmg{Uc~WFUr-)+=r{tm*Ljod&Y+CEWDcN z=q<&kil88Lg&cQap|xZ)bjyKy=Dm?8P$8^?8JfbP*9ZZC@xrS>?${v8{(eqUeW6<@ z6ZBC=(K%>BE+8mZCT(PD1ipt50I}ZmJK;)#q7@Yu! zx_O_abWE27w#S7cyQ+x1I*2@{4zEUTBqN3m@o$|Weo#?^K76M$WauvwePx^c(QBJfgAeRcrUUKri!=&>kNlK#-q4-e`4ahhKFER@ zLrET&qZgtPNW&klsZ+KX z*+uImAaYqwokcAyb3QJru4yk;3bqeavHsy9z9Q)XJh>ie?3zzE6lBuQ%n!e-^W-$Cv(&&1s$GE^+5!ik*mgeOU}?75h$6j!meK z;g`NIw!0LpM^aCmxFd%L@%W?Db~)(eb&LBYevioJFEi*7$E>4J6E(RQLRvR z+MdYs_+`?AB(6-yM=?sqH#hKh1cFYPOy*coL=3?B7tk6WcD=xX6DI}4U5iDS*6Mz9p z5F*+mrvp3qFun4OZ1JV)1bm8#(I@^fC%|LpCk6qo#z6Hb9ordso4_Y8A1AOJ`K7I$ ze99&|dTharqitdDYU}S>Y`o{2U15|=kvdcq;bYD}A|{p@sl@QbeV7^($|&mSvMkd> z`Ah%Qo}zdOxQ6bC2Ih6zO}@h(t;HO8%xTgze%!Mn9E{&&SbqBwNy%Y=DP$6uC?~ zSr!d-{zbd{P_CP01aLS$i0dr)wiP#EnaU9;N1$c|o_OLZ;}Q|i#rSg3>eWZtamTH) zmn<5R|~P2cO?0RV!pECy7U9p<2_%cBW#xQ<`sm z7KVz;+C|-V`G?@>`S9yxcGos@~2ZbbC*^W8Y%BYJtkeM7c-3@2}Z41r4RWMHCf z0(9CL1B667cU~eH)>BzPG=Rc1%7-aBB_Cl@hGkz?ZL+l!cxOz&Yz-dX`StL<_RQ4N zHqqT}3umpirF|FKu^kK0jw2G_h=0uenB`GgNUA_@iWU+wi4U@*30Q%L<~@NIPAWo| zB7YnfSA&uOC^^aF5-d-N?)uaU+3*CMDwCb|B}i#{395K!SKun2byUx zA1HT#j)A7}N3rM=&6lYeMxfGBS+w{JyoPydelxgJ`cRI*!88K%=g+YdPgrfoAAhu+ zaKbV8deQ9szD-PiE$Q`25#{7Wu6sFCL{m}FK150J5Rf92=zK&ji+MyZIj3fHlsV@{ z8$MfJGY6yE)M*^=I=ue+TkO-H`I6mn$4{os*S1y5ZSjr&?gKS#T5AIGfIW z`~S4Ihn}u6+S$@!A6)bf`_Q6yS$7K_VvEF`BF?VGGTWmbdB_xUzF7UUxI^UoxF_+1 zrw8o#&4uVC&+G-+03tisBM%vi{Mu#G3*AP1cprMb9N-6@$GX6+YJAo$_`mBf{a`I)- zLZWl%m>|FSz@KDEXIarmu(>U2rw$@Mwz<4VFVP}?Z$mS9lV7O#eUnZjpD*AA2$YWm zXZ&NIyri=0W=o$uIaS zzd?6U?mly@Y9gHiw&0}?=Q8s0uui#)o~F*cLph7ic`UAB^dN2OhRhU-o7D@|EAPfq}x!oO{uk1)upF>w3vq zdm*{|A`JzaaHHeK(HN9>2O90Df zkWcos+hSZTScW%7bxi<>jBdl#U_@&PiUl>CFGqZfDGC6^FTZf zep7q0L0R>czEU4SCHoh7_$NNLmq1ek)4BvAoQ#k_V2u$Y)@Y4Dz zryOS|op`LBa`JKde5OCSPQch=t+Vm97CdwiPmC74PqE@sK^5lWe0FaRjo)NThoR!n>0Hky%`6~GY_NbG* zw9I=dDJoe4G4|cTW%wii5`Xvr3I7wFUO<+Lq?02@DbF<~;By(bOPW9<`%3T!Uh0mB zXxvi?A<*F?{sJV*GUOSlbQ`XdeaLC9lQuOj;MG`26U*o$etGA*xjo9%Oe26`%MdS} z<2T=w0xHeqTGD^vlLqsc?GeXG|c+glT zEiRL*&UO@nAJs!5-Eqf{aasM#xV(Ndz9_hRCyzzf{w z?R$>Ewk}M~+~7R7?kv@}73x19{FQy-nd@x*NUNRR{UV#)iXS-Gk#y3hF6tz|R#8EY z|BO#$FbRYd=oAZ)2FtJOYO`O>Y_s(<@mK-C_?K#z$g2&dvk>pm8<!CWn1NpM+AJY@x`zOBf2Fqh9c=QQK8cI|q*{Bu`h`HITB>Qm1} z7w#93xhwnAL9gPx`GMOP*Cx^^)p`6#>bf_=!O zm~}FeGU(*b4fj7OuG23+>7&fc(@Y2LNiQ08i$SQMN^f*tRElFEKgCOF*QtJ?D00#x zqhMxL^5i9>i;(JNaF8d&P%KlEjR0QQe)<455RSkyl_OA&!2TG4wpYK^+TZ>MJDBPP z4hZ0R8o=i<0G<)8EM6Xu=q2adXlI!xgF`hv+rvYZYO5Xg-A`NFN_=v0Kcq%PG+%Om zzx~72EA6Y_jFlP>PFK2q2f$*MJB12(zK6-eHA}* z@=-UE^ttWmk6vp8e(#sdLI8i@tKb4{nVM<@FvSd(4+AyTCMlgc)JLF#_hokd{nb|K z-tlGd^?mQg8J58Fw3%k7BR>`*ZJ^ZyP2!BWhqGSCp;*8F{)coQXFNRA_paZtIe-0o z`>m_f2{c!(@3g=D>I(bKpU)NO)7h09RA*V_yHOsS!V~eO4K&%;taPWn|sBQQWmAlFG>01(ubwFuX~Ci9khQ1RD&9cX!bu9sZ$6?{yxNq|TB zBr6|ykE7Zh#L7SDXD&W<8vPWFWR#>6?F65xJ$QrWm*kU9j!Du9Ph2K|Yx0G9DJ%Qb z4;e5f8rt;7$TCah)y9yI(y2P>CD6nmHdVq@vzhm3;yoHu&Hq8*rW(4^nQ{d7ZUj2s z|L0bH;p_HFxDyETQ~=J?0X)yZaw0CbcYwwdGb5YNx5S5szI@HM>|3us+a8_u+`xUh z#%DT!X3uDg{mBhW?GL}Z#5yLh5qaK>6c{e*^?7Q4V(clq0@2F{2e#QsT^HE=YD9E- zl7>(MlNo3XJ<%qRK)z^*LSy6yaq0UZfXawi&IhnuL|^tXu^U>TCj*=)lSW*r1$E~5 z*Ei6oMsU9-7zA3-ARvaigG7QUG9p*R(c2k;6Cg@_1W!(KKt+9`C4B@y0+_HuAVys- z&z4+9Pq@<@y%C@#KW!y_ltr2MT!MvMnZJ~gPS9jud?=$%&H$AGL^B%svi8JVsJq@= zK5SB6{enF6(7`ejJOjHeNt`~gLS^$-)&c5gsM*x)?3y27u zf-YbRdVF$}zLcq1Mxe5m-#UK`n{8>cxK#R4j=-Th0xc_7Th}K(gYLx%ecyW84mFH; zp2?S?19+YU;ECJXo|oxv8@H?Q8NpkSdyJ-W!>}(vlUx3+KbmL%{c9_1@fJMP!bBp^ z+p$})%v7u=9)6GeCcG2!+6{MFr!BIRJI}-S&GFQ=PU0@+vJfCG$q94@Pv|A1>?YoV zc*egE^27M`^QbO`ci_uc9X1#5wVda8q-bec%EEBalwBrAzXU9iv)kM!nByNjQ`R!F z#U{o_Q6~TbFJFDc+63wZED(-Y965k<@TAM)DY`h3qMQPA1wbl22~_&!Vd_fq07cS) z?HC}I{L!wv?E^T znY`;Fo$ZtO;!~NLYXtB^_wgz=7>~9xl_OA&K!Zo1{aqh}1x};WlSXme-nqq>{|72@ zB~lL-G1_@17CvOu^E?5br{ED0F6(i^`6>V>m-S6Hv7P={ul?gyN7y-!V8g_2z&z&P z$hmtI>8L(4zR|w)%s1^9+t%3$o#)#5-EV~)1f++#3*^zuf-<&cyyQqGGurgXk78eY zysyJH0bCmL`Q2@R!lnh8V*wSWf0cEST_yH_3DJ@%;1UfpM@9Fkw)NoM-gp9?bakH( z^rU-OL7+Uo6^k|iD2*-Z6y_=oVDSN$%sv_kjMzp-+T}_SJC;>Pj+DvMft0v)2(6gn zo9E=KfG5~OF7m_;3Aam-tgQ?erjp?zZ>_KNQj%nLp9tD$6Mr6sl(ys*9g|`fB5^F#aKcCzpSQC1T7I5ar~j9|=4e{p`yg z*=?vR2Tb`~+`;-@>#%oOyWN_ioOfr@lmp||f^BW~->zM5@40J%z(b7}#i^I)QYO;4 zpnmJhE%wDDp0V~@*V-9V=h;hp5e3yb7YxY##7uryduyQ!N0)RgC4>po1bG%xv5x5Wox3 zK>x%c6**v%O0C2xx(i3$?NDvnG;%g9us&7SUDa=*E7B#0-Va9B!h6MjL;4tV6Ko1DXC*rOpmGGxxLjDlfo44 zgcBhVz|?z0U0~*2CDAeH8yf!nVM|`urG{Ov41l#Ql@eQ$`NSP2y}K? z`z0T4l=fZf<;AR@Zu8~;d)yx)Iu5ro@=`m2C!cI*@aa%YxKv{=wl*yf18DNH`t?}$ z?Yl#JHd1X975lwg53|3x{&2j?3JAYA(X#Akr#kh`-fbRE83h=1GRRmxQz)pDq9qQ2_V=aK_LgZ88 z_%g8$A=e8yq|4`^6}Jm`v=xQr*yb|ftLLDROMP>jX=eaCl3(AZ3%! z^bNECmKtl0i}=7pmuQ1_@d-@#opl;xoBQsya@{N=fZc4Am(FpdHH%B7ALR%fdLz*O zhTpbIKb|T+z=`Ln|J?4&zdzy59E-Q<1n}g8Msskx-=UUPAh!E4EFVOqlVI~|EDz^# zm44H)ygC4qsC=#E}z~tLId5W*?t>RKR@3CyR*}d&H15r%uCQX+(ELr4|-obYb z3FsU)2Who#PvJ{Ke79x=pQq%w2Ed8vWdImSX&4D)q%}w~LfeErfp}<7+X+UgL-sRg zP{>uND8K|Ij9jwG<-sOkDP{TgFNkMqWWfCwE!F8QRj`_Cu2YZ%G=7=AB*Qi=l4qF( zU$KBD0z~y3n3JJLzfaQv9|S0a#5(TGlw=}_&av@26l)NRt)RsQpxvw~D(o+Ng$Bq* zU!}NQHP;C6(mA%$XkjZhmxHA@

<)Bha#FskOcGlBVs&y#r=kE?eU+t^zJPBRyQi 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

PvljA!5kT-OY8u?nC4hU+RI-o&OT^{{Uv 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 R)Bp(hNsB9p6}>d_`G4OAt4RO= literal 69789 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�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

<)Bha#FskOcGlBVs&y#r=kE?eU+t^zJPBRyQi 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

PvljA!5kT-OY8u?nC4hU+RI-o&OT^{{Uv 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 Date: Mon, 28 Jan 2019 18:01:01 +0300 Subject: [PATCH 016/136] using String instead of byte[] in java wrapper # Conflicts: # android/com/mw/beam/beamwallet/core/entities/dto/UtxoDTO.java --- .../beamwallet/core/entities/dto/SystemStateDTO.java | 2 +- .../core/entities/dto/TxDescriptionDTO.java | 4 ++-- .../beam/beamwallet/core/entities/dto/UtxoDTO.java | 7 ++----- android/wallet_model.cpp | 12 +++++------- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/android/com/mw/beam/beamwallet/core/entities/dto/SystemStateDTO.java b/android/com/mw/beam/beamwallet/core/entities/dto/SystemStateDTO.java index 11668b6b7..036a29db9 100644 --- a/android/com/mw/beam/beamwallet/core/entities/dto/SystemStateDTO.java +++ b/android/com/mw/beam/beamwallet/core/entities/dto/SystemStateDTO.java @@ -16,6 +16,6 @@ public class SystemStateDTO { - public byte[] hash; + public String hash; public long height; } diff --git a/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java b/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java index 8f847017f..441e3473e 100644 --- a/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java +++ b/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java @@ -16,14 +16,14 @@ public class TxDescriptionDTO { - public byte[] id; + public String id; public long amount; public long fee; public long change; public long minHeight; public String peerId; public String myId; - public byte[] message; + public String message; public long createTime; public long modifyTime; public boolean sender; diff --git a/android/com/mw/beam/beamwallet/core/entities/dto/UtxoDTO.java b/android/com/mw/beam/beamwallet/core/entities/dto/UtxoDTO.java index f69ed8bb1..74f662fbe 100644 --- a/android/com/mw/beam/beamwallet/core/entities/dto/UtxoDTO.java +++ b/android/com/mw/beam/beamwallet/core/entities/dto/UtxoDTO.java @@ -20,12 +20,9 @@ public class UtxoDTO public String stringId; public long amount; public int status; - public long createHeight; public long maturity; public int keyType; public long confirmHeight; - public byte[] confirmHash; - public long lockHeight; - public byte[] createTxId; - public byte[] spentTxId; + public String createTxId; + public String spentTxId; } diff --git a/android/wallet_model.cpp b/android/wallet_model.cpp index 5eddc9078..bfd8e31dd 100644 --- a/android/wallet_model.cpp +++ b/android/wallet_model.cpp @@ -46,7 +46,7 @@ void WalletModel::onStatus(const WalletStatus& status) jobject systemState = env->AllocObject(SystemStateClass); setLongField(env, SystemStateClass, systemState, "height", status.stateID.m_Height); - setByteArrayField(env, SystemStateClass, systemState, "hash", status.stateID.m_Hash); + setStringField(env, SystemStateClass, systemState, "hash", to_hex(status.stateID.m_Hash.m_pData, status.stateID.m_Hash.nBytes)); jfieldID systemStateID = env->GetFieldID(WalletStatusClass, "system", "L" BEAM_JAVA_PATH "/entities/dto/SystemStateDTO;"); env->SetObjectField(walletStatus, systemStateID, systemState); @@ -82,7 +82,7 @@ void WalletModel::onTxStatus(beam::ChangeAction action, const std::vectorAllocObject(TxDescriptionClass); - setByteArrayField(env, TxDescriptionClass, tx, "id", item.m_txId); + setStringField(env, TxDescriptionClass, tx, "id", to_hex(item.m_txId.data(), item.m_txId.size())); setLongField(env, TxDescriptionClass, tx, "amount", item.m_amount); setLongField(env, TxDescriptionClass, tx, "fee", item.m_fee); setLongField(env, TxDescriptionClass, tx, "change", item.m_change); @@ -91,7 +91,7 @@ void WalletModel::onTxStatus(beam::ChangeAction action, const std::vector& utxosVec) setStringField(env, UtxoClass, utxo, "stringId", coin.toStringID()); setLongField(env, UtxoClass, utxo, "amount", coin.m_ID.m_Value); setIntField(env, UtxoClass, utxo, "status", coin.m_status); - setLongField(env, UtxoClass, utxo, "createHeight", coin.m_createHeight); setLongField(env, UtxoClass, utxo, "maturity", coin.m_maturity); setIntField(env, UtxoClass, utxo, "keyType", static_cast(coin.m_ID.m_Type)); setLongField(env, UtxoClass, utxo, "confirmHeight", coin.m_confirmHeight); - setLongField(env, UtxoClass, utxo, "lockHeight", coin.m_lockedHeight); if (coin.m_createTxId) - setByteArrayField(env, UtxoClass, utxo, "createTxId", *coin.m_createTxId); + setStringField(env, UtxoClass, utxo, "createTxId", to_hex(coin.m_createTxId->data(), coin.m_createTxId->size())); if (coin.m_spentTxId) - setByteArrayField(env, UtxoClass, utxo, "spentTxId", *coin.m_spentTxId); + setStringField(env, UtxoClass, utxo, "spentTxId", to_hex(coin.m_spentTxId->data(), coin.m_spentTxId->size())); env->SetObjectArrayElement(utxos, i, utxo); From a263016dff735f2e7e9af6687bf4958c28e2bee0 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Thu, 31 Jan 2019 11:48:09 +0300 Subject: [PATCH 017/136] implemented wrapper on deleteAddress for Android --- .../mw/beam/beamwallet/core/entities/Wallet.java | 5 ++--- android/jni.cpp | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/android/com/mw/beam/beamwallet/core/entities/Wallet.java b/android/com/mw/beam/beamwallet/core/entities/Wallet.java index b61f2d853..817c8c536 100644 --- a/android/com/mw/beam/beamwallet/core/entities/Wallet.java +++ b/android/com/mw/beam/beamwallet/core/entities/Wallet.java @@ -30,15 +30,14 @@ public class Wallet public native void getAddresses(boolean own); public native void generateNewAddress(); public native void saveAddress(WalletAddressDTO address, boolean own); + public native void deleteAddress(String walletID);//const beam::WalletID& id); - // not implemented public native void cancelTx();//const beam::TxID& id); public native void deleteTx();//const beam::TxID& id); public native void changeCurrentWalletIDs();//const beam::WalletID& senderID, const beam::WalletID& receiverID); - public native void deleteAddress();//const beam::WalletID& id); public native void setNodeAddress();//const std::string& addr); public native void changeWalletPassword();//const beam::SecString& password); } - + diff --git a/android/jni.cpp b/android/jni.cpp index 37491f0ff..70bfeb8a7 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -302,6 +302,20 @@ JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(saveAddress)(JNIEnv *env, jobj walletModel->getAsync()->saveAddress(addr, own); } +JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(deleteAddress)(JNIEnv *env, jobject thiz, + jstring walletID) +{ + WalletID id(Zero); + + if (!id.FromHex(JString(env, walletID).value())) + { + LOG_ERROR() << "Address is not valid!!!"; + + return; + } + walletModel->getAsync()->deleteAddress(id); +} + JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv *env; From 345bb051ad93e88674ff0a7d0f85219ca462d04f Mon Sep 17 00:00:00 2001 From: Roman Strilets Date: Fri, 1 Feb 2019 13:02:19 +0300 Subject: [PATCH 018/136] #392 specials icons for testnet --- ui/beam.icns | Bin 171228 -> 5370 bytes ui/beam.png | Bin 46273 -> 60631 bytes ui/icon.ico | Bin 116398 -> 39299 bytes ui/view/assets/icon.png | Bin 46273 -> 60631 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ui/beam.icns b/ui/beam.icns index 207d7c53c53573608bf7629d26ce92fb0efd8534..23f18f6319f39fdb53272bb1563e4a0a3df8a89b 100644 GIT binary patch literal 5370 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 YKh@8hxy6wfJOBUy07*qoM6N<$f~9PIVE_OC literal 171228 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≈!>cf09;=Sl>$u)@eY;&lFR1N zJz~%gHVZ8fVC7Ar{qBFW9Hn$}%NXFs_n^-dw?#ah)}7Of1jr zh{-z%G0HpSTyV^~NiO`Hi(t1xSF1%+{#T2~-=I>>Hw-=Bd?LVcr0n;Q8p|S#*!}%q z1zf}vx#(fYH9D8dE$g}&bY{|aL)d3XWx-rTJU0#Wbcirm3;HK8A@8lHBz?Fbbq2-p z4CtxRcnqeCFuWcAZ|p63K}VmzQ*Q}m+U-L4MlP2iE_&HhecvF-a`l;0?~~hF)ar%@ zWXaTLYGe3x5M}2;45g-J)Rj%aI}SNw=7#vb!TN!a4E}YySJ0Cn!P}4;g>GrqT>*m= zc4wg^6+2(M)wvTb!k(T%e6>VWg+IlF0(%(yM{hKwn~FFv%J=bm*z2CP=bTO0bNucc z+UB+g$oCuAWLUwKoiA|}HrfMl-3qg@qyh*6yVfoi6Bh`Z_8=+%sFWIHFSsXI9Ule* zFufVfYg31H1^gY~(OYm0&Ecis7wMNdc6VDr`Y}AFa{2k*QJx{gV;nSXmz2G!7pP56 zZJP$dVHGTI@Vibt5>dXg0SK8(dmPUm_MoeO`kr}Un0<1TWv{Ik8b-Jrg!5)WD9W3sd7;Wn%f)d zpe6p-0Ajio7!5z~&j*lYhv0cy_Rjf%JZ!ER3;%xyZc8iCRlMM(?3|7$U>P>LE|}iL zU*#un;z3w``E5xx1sCy&~7B!lOFkWm)acuab@5x@!-(@qBO#4O@?nEQ^|3)xIur?#?U!ZDX zg7hI?FW~ZFt#d{OvU9C#l_02$gxMC{RTi$5x7X3PicKz#3psH_=UawPnJ>cvYzF$Z zN)`mYj;TKY9Bll?IZyT_KKML^txSQvb4XJ>Q-O0znZao^qdH%h3J7$MV0C73+ab?5 z4K{4klG9veKH-)kn4zNSr`9;BB#wA1x|XbnEO>_R0bWXL!A=(q)R+zI6n^!j2mJt8 z{Vdzu6Ja{D(FEymwVPIiG{d16x{uX5zo5Btg#(L>U(`e)@#V(b)=j$u=h(2m)V8nV za5AN20bJ{iqJcCzsx!N9GwPpIsp`fNKECVkc{Ini0o9sIEn4h2^x$ipgN7~eb=wMb zXhX^m*kwnz$|%6U3>62F9zed`mel4U8Cioq3oa|f@%u27uC}+mOj0>_y~`GWwa)3* zT;1|s5ts+z&CKVvx=|=gM$+vvTnK(Ydu!6vE`)1Z7dgRO&@Xlu02lG*w40*x^__wu zfK$zl4qnMSX!Gom31M%-LU*Q;S96iqRs;Uk>E#+N%K$`F5~sf@cA|{#4be<*veR2M z&piQ*jHug1;He$#XJYI^z)Kin)v}%3kPmVQt4Nz=9IlW;K*VHe?28Y1R2Y%Ayx0?(nN4zwEIV}We zmoaC;y3`-|7Uz%3vg0aB2!;rt_4S4y#2qrTF?^mkRsoQ;5(GF^8Or8^)c3jKBcI4e zzoSWmGP6;#H)uMINk6;dO-SR~1V8q<;mRkIh5J$#(LZo^=kO=Yu`>%wXj($Y{|k#~ zJusL}wwqF}Zm67(+H~{G=ioDYbcE$#O)wLd8oCAe-o#HIdw|z-vuuy6`xi(4h#PgL ziZMU(z#+P_x##fH2{{BjQ;Sc`ifOY6ywrVBF&m5j2`)yj&SVd1O!zf(VZ4x5k1lPM zz^RvI_B=HZ4F_wnnBQtX2ZqHvO3d}`b0mV{pjZWn2%8{P*6vwF-h1T6yG>*EOcose zq{+h+OmA@MPHK56D&nMun6^uPU%G_|Iv4lB~6mjL&*!GM5` zp1zYse0)-(!31EJSq5S@Kh1frg!m(_i6D4xEtz&)D{VUX{I;2`fub*RUOMeFpMR}o z7>eq^XWqKX!OJMkktmH!>4VX)pW$wAm5`l2ZcZ+=kAPycF6wJ8mI4*Uw3|*HRLlZI zxIyDXc2u`8FbyccRwB7mNQ9N;p4H%jOTlSbLs^MvVlno)zK<;o3j64ka?TNgV}gfx z^vS*9c&){br#nMf)z06!y%|EuXY)Zmujk}fQNT+J1TT}} zBP-5P@VyRah{) zwlXuzrXUCfLCgT;I&0(Y18<3NX3g)6-JxfKtt%lIRn9UlIq?ydfB+nKN!=Aj! zYtE7|bEOva@{_@9Hm7zL+q#4P=Y6{nFJALB077E6&g8v%599w7YHr<`C<5dkjlO@q z&8wqFCCmeBde)uiR|TP0p0i4ztwZo&8;x9>rmMd7BXk6|chg%N(?1ofX@S=@cvy*_ z^@3WCWRaK_NCm3b>1cP{3yY)nOp@u4A;>UovV%ma20CenD}Q7k8vMwp_yHF?<#;Lt ziV@0Pgvh)uyzeiR(zw?dA}<+I{8?kN&wsFcZ`I=>ZB?J)iszQ6@WptzR7j>DJ%X`a zB)Bpd(%vuhJrQWm_5g2lAH_;@QtYC3C@-i1EG^M*+cK#3Y2%eBi{^WBH@0u#)4uRpFjEF$;qW<#;R{N*2Q={kq` zNxhcxRnKsyVwEdJyM?5V4Q#r6;q(#7*g$1jtq#CMOZb>W#y+`-e#P#-)FNQXa{c5)G%n)uu%c&bBz!N z=C1evW20 zTCl}VSLjvjyC}8AMp`hw1%pLgDau^5@t!ncBy8amJ*4Dh^h+8+-7b&KfWe0rFRXok z_hztg_IejMp+lmqV#?8o8_T=?%1QB6>flV~z}Sf4?5nq~*ByZrB5&04w3&?-Xyk7VmOcq<0BWEwsf;MDpSHtGR0i#Uf{YT3i4KfxP z)Lraemv*9L3a>2L2()ZPpsj_LjQRlYDWyL5-aN&ti|Z-gYN{c+X{PVf)X=7U9wDRa zl^jep@E>H`$8PBfG5o?VNUJF1P(`p2X9?O>0_galqd%(;IZ5uqhX;R_3WhloyLnBOyNz4zHp$xRbJ|>& zMt|`I?^ve72LDPz+x$+hu}{g@g$%zM%hM?dF?#kh<$5PaUjv0L>?TJsL76IOi9;?v zZao-Nj=VRJ>|oZ+jDV+UF1z+w zW7|H$Ma>$rD62ykuJBGd?d$U{%WngPWFXG704ujMBh+*fMo|kXm3Ko3WV!imT{Tgh zK6u&KgW>sP=~f0@ZL%(}c|?duLfaToVT)vyMEvS5EUWaPXB{71(-rVdf7lsAJC zJ4Lm^Be2LldU;mPBZa6`1+-+#@=VQGlmme>RWH@*-@_Z2r6r0Q^brx5N$E{eWFhoq zKdRH?y68$<4xgoo7z1M)`c4(cHpe(;l+*QzdP*W~!GKG|;}E8O>LfspE34_DE4puN z2p_ufaG%E@J;p|5(Vq-(7r4_`4juW7ei;fnBWYKqBlXwSp2229K^BM|5KcIw-!}`I zAs=4_W7`y)ZF%;ESf;I5qPWU<0||)wg)XYP4LPG;qB<=U>JSve3m(#vGH?*EpZlgp zv-Tj%Z-q6iijCkIICHJ6>7N>l^1NfT{+UaD)DXw|0GV-bj~^FA%3BTZ;={3=CO}&9 z2MF+E4C@aae)SOHOSf1gIAQGKQ4@cy#WROB9DzXY0U+A$y0T5vUo2fX+@h__8M>^< z$qayXY7myTvK(53M9M#}c`^}iD~D0&@Bm3@(53zShmoJ%$Mo#iXE`%SP%S12jud4obtm%s6;IqI@}n z$t=g`^{iO>GpSs)`)BtoYe^r}d>qpFH`3t5mYRpeHv+l!C&iP}4z2q642-9UWsUpE)s5_|p_E zAW6eY4Zw!2;+xKUZu*dgq&OE2O=9GV8NkF-=Dx|Doozjo1*e*u*!o8!+Zp8jl5JIb zjFvnWv8iwNX|@uy`^@dzVz3iANbYTI!P_M+)9VEvM4s96VMY-- zjsY~kC`)dm%yo=mw0tMY=?$Iw3V!jUvulmpim_PSUKY`s6~7CQX#zD}cKVWrWU?jz zI@lJfSoG5|oot8MOjgG~^WSPZqY5Icn!NPDz5-)HpO*a?Y3f%FZ^FFn%>K4;!Z zd&P$~#VsHPv{27Lv0~l%Do#8`ay-@Q^3kvK=+ZY)l7L{uzO5@Js1@UJf_INS^?oe?#{ZJDLa1D~uW>h7gsR`h0MU6WKGG|rV6HR2b6V`J>_Lr(@t z*yV)nLyplLnm>>1Kz@OxjZv_3fBTSGcrzkwbrXtJLF?!6=yv;hBK{jWeY+!<+tD@l z^m+U@llX7mKZi#@!=;Pu*`MLIK=@AUtkKwo8Vx~h$U)xl9jZo6VZEXyc4|Ps$zQ)B zF+q6ib%#$R#iP?1aMo70&BoowYk(b@YF55)A>4wSx^$b-rkVV1c2)zC~BznpyL+A zf%0mh0}GP-{E{0d!?@dAuspb)JXH>OKlfC`JrU(*Ud-d*^*WAni#D-+JYF8EFPW_J z^dO1gL%*!xlb`ok)PKehS6;;r>Z|0AJEnoDJxNOzX6+st#fdf(_L6^anmg zn|vnV;G9hRfMX4~B3D={NZB~kSyX(G;xFal*L{z%OjtjyG6Zf*gYv+%VEQ?T#3W(! zLncD%oK-XqpZjK5_oa`k&z|qJEVAqi)SIuXLsDVYgQBr0w(n70B4{oNq~ z)GYn?Nhv~K6kG4ZZ@sFP&M!&yjrg@^s8#PNLsc^qGdNuGfJAaQ-KvBp8b(OEfS zczpgK?wJX*4Shh*c|+di1fot|U`}zH>4vO^nj1D9pdQt+pN9hxQs4IHu{41N5C2UomVC)HCg6d!f{0#UVl-A?u<8<(b$n-;KkzSH~?HRs%iQ zG9%3?T&>|n(Uh3y19t)$eU+K7{ca~9RY+pI?-jJVU81PIGTRb4d%pw%7h6y=VbdL< zVRM5=m>I}j9c?>|#$+P$TG5;-ydqdAqdWWDTPv!}onpTBq9(xOy0`rnpIxu7(Jp-= z!pl~C>SbZX&*GaD8-2+cy1+v$oXzMfx8fM18Dt#7xCN7~MX!tHV81d^JW7p1Ag>)q zmjc(`VHtx}z*Cumz{Kr|{bRk{n{ww`^}Molm0kwFVMYhJEpi-vMmbo=Ne&SdLc>8_1UH zKpiBr$R}RGj8=S8cXcl3=Z=nW5km7ppW^X5&!i{-IbfRw5CkbvMv~)tLH|o}rP)ki zE-sE@j8K{st*&&W8&RS_vl2uw9g>^Z(#-E)?VI4gB-jl=DzAukw9lO3AzNWKCR>T4 zj^egJO)-bz_j(*6udeeM)l2WR!gbqP{o3HX9EFmz11SCndZgfJ5i1<{-4VaW}ccJ zY_t&q+9|4ioMXZS9WC_Zw$K@#f1Ws2v1>&Ph_|tSUr1n&V|3$|Q^n@_ctp7KBP{@R zf!XEGKbg>O!eAT_HN8704dksYFllllTK+~B3bbg)B&SX`hdo|Klv?!(2$LYJa-&!> zZfx7ms^5JHE)o%o7JZZr&D#9zlqihn|92=dnJDgvS@p#5G}h4hD9Qe1sQ*>Ys3-mK zyTC-d2o2RsnLFEdn+3&i!4dIPDcW&#j+yt8@U$W&K8Qis`t>Xz37_ChflaiC(qw>x zXHMBj!5ZCWAKu+lwWbQ0#U|jh&%TnUR**$(1zs7piA>{@!asA>x}3D>3M&|>L-0gO zC>w*J3pF8xHsawS$8u5b_oEcbi81=+G{S67+|beFPMVvkEm$L0Sy#}U7Q8$QEDmT2 z+PfQ8vwX{o26Vp*?4___ep-nHkhaknOPsGaBnYkN!)sC>?cx_TQZjC^H5v;@!54$$ zQ82m(8lg~wrkeHkZ0Z86V!3YT0^V3q{{fMjtR-NIR?vTLLsw{BbNk86$&L$ZPzpNC z&R?s)C?SrmQst)BM{FhJV%f2=@;(&l{y9%X6Wyrm{}4!@ zVc;~@=#-e#qUR~)+3tab>pld&WQn%Zrr2$qNJX(l&53+^w~7XjXgTSDS!EyFK7p4SMT_3&G=l?Q;S^c)N?`LdFQlCr(ftswhm`iTf_#d(#Rya4o0*ffR#4D9tafo~8 zBiJhIsGz`lOe#pP1-*AFxG>R_~D8QhBbmo3Z59X^jqQ z8G{#K7+0lhgitn~uEHs@2zsqH$iaEvCsBQ()<2wFuN*4K5D|QF!-=RAM z8Xl-G)Y9^aQ8iNsKjzUe2RBHMANe2~`9V_g{oPIG^h#J{sTlr$66dA-oU3$F;CR3L z;c=l;geegp=1yni^G?2b2*WsrjxK#trsI}|Q?~<=D)x+RTkNGDAO{wO2hc}V{AvQA0`RK#=@9tmf>I;4W5Su@gwNhDtO`Mo#uNNB zq0eNHq6W&Dd#taIEI{EVcOxB1e&H>^vhqW_*Fus9v+~ksc`4FO=2)vW#Z;zF`+eL7 zt~#-THXNgrsO@a#$S{KRd9N)VFp>uUmOa2&f#956zSTK2P z_Dm93XkI@h)y#73vzt%3r?)Z9GU9=ZyHmL0SIfwjM+J&pux8*bXejRN&x9o?4JO%$ z2{-=ba)*=*mrz-axh~kagPt3`ztwjtZW|YK+o7_1zlqOUs^?Y}gOcF%Kx}lb0?`^0 zzH!EO!!Ve3NCt&bI9C5k+YFtilCq|nSHGq1x__{UYUL=&!laaz;8I%!I$#o*S?@(V z#V}^%-fHmaD6nbQaZg&vri9&pHZPj`wCS5?Fx6HYh!-8=PxKb&WbbN*!+mGC zhrD|_%K1*bC)SS_2z^6l7@*qq^Ns^xlngwI&Zyjl*ka5TS39J@t|j4r5T~MxWar2Z z&AiX4{|&j&Ky<}1$(3cW8(fA+3evC%HfHqY7z)q55~AVR#Z7l?DB7J=4)9#G_AWV8 zejPzH1+qjD zW6U>^Sd5P7x{aSRz4>~fM@rZ>Okq1F#nNW{jRgcvTqwx|5Q2hw&P=tO{ZOd4HDySa zqCANM;wIcWZHIV{{qUw&J2bgbT37^N?UOI2AKjOr*nS@k@c^FL+xXxgpPFqMIxG6$ zaqrUQx*TL>A^j06GrN%72E5^l?hqCME(p2^xEyLh`s@%>!hn!_(S@$q*#kkv>G~N6 zcyd%gFFa_nF%3G}W_|Gb+uGt$Q{TmTK?Zgf;!3+z<&~(?D|%IjOwd4+<lkDgdsMmL47sM()z{kb)CGVQM9zU?Ro`?)FrJxEG2>Jys#phknoH3 zE?!c;Sc{LteV2HqlNv0wQmizYqS_y>L${@tj*3ZZHovZlf4CFhPA+Y{dJd%cn2~Dr zFVD-w#l6W%=QI|fuLcAGZ<9|GPJJxV6W=4tuBPqV6>snqqv&w|46`owh91En9~$^9 zitCNn&kax;bqfgd*Nx9y)ku^N09k4%-`WQh0000000F7Of$@=NK)py`Yf!TBS~5f;6rPXIbh92Hm?@Ap zU~YqE6e$76V=|fQRy1czXF3q?`2hcUp}dpUPdrXTuSLgTK~?^?^YY1Ftb*E~=DZ?F zU*DxZQ_KUBo8gmEI_Ke*8SgvnrI)8>;Y|-(y~|hn(wQ(laz*=QzrmURDyx2bT_s%j z1cWxy8!Z}0-w9&(NTZRv@#Ujc#rWxJ!037_zvX93c)f{7o&3&D;hE&R{*UCNS?(yR z7^rr;w({^3$EN&kU|>z-2Qw!!k!w5!n)jk`A1{&e5Q?_JsGFWp(ndjUAO4%kvS$nJ zTUevy^bGZSAbCyBH72qJK`?xMd+)R+q%G-Y99d#eRl{N=QOu;Kc^ft;nOIxB0N`fV1$5<9 zO&b4ZQ1O{E;DlcRFj4qu?FPimfy3;pQtk2 zx{^1mbTd!Yb+t$$RmI^85)cSogDN8`{>(o}DpWz>i>H{M3R6&3qr00000 z01R#MI6P|>J+O1g3Wl;KS_i$@Isr)0pIrc}As?a9{kzl5iIgZ0b4W921dHi>7kuv9 z*-qthl1w5rA|`eqMScyK#+L1Si#?iupmk-^Z5e2Upw~sQ5Y_D7t?YM`gFbk#8tVwN zjRS?wfo4PBRuW;37Vy$ZC*ZaQLb*dH78~d@v?-`%Kj12sf@Au2{TW@08ux|+rI%QPbktOOU%cR?q zgk4a*KMRq#!lUtpMYBG;qY)SO_f`>`%5^{S1?c=@u}I{y+=kaNwGbV{;C`et+VhT_ zHNa0)SYjXHif(NS16@M8O$na<=<<1#vex*_|9?}`p!Jf3FwU{BknBCS9K~`1XQVFB z%yDEFpT9TDn^TBiKwRiZgM>-@g5oPtnBlr(i~8q)kC#P{ZOR{hu4V4B&lN}zzlt|^ zCER4%Dkdu7Nh8lz@d`>w3fM@|EL{XOJiXd!Zm%dl=fPX!LT?_f8D*bH?jQAY>ba5> zB$+$lVz$6+Vx$sJP!`7t637Pn{_4Qx-`fW}yHf}p*ybGpka!Twg| zK8b{pXplkZ+WIH$;^pEh^^K>^EaO(U_jzmV1+uRE(<}fEF4lf-8+1`3e_6Vm>MKEup~@|?V36l7l9)ithwhU3B`f#rZpr=W z4pZ+f$AiryIO1sXxAH{%d}C*~D#}p*68YdK1{TCC(>z5Q1Q=9s(-)|z9 z{9D3;LDuq#u))Xth{aU54ht!Z`9KM8mWpgMhpxIYi$Zy})J7_fZd{5};G1_SJqaZw z<{~b?iBnwFu<+xLH*oU=CfscOBkbbR$P(?%kI6($<1R>9d(4;>y|7MYG%`CGU#k%| ziEbgU0WN2IEFZ&xf;$chVoVrl^yeB6QoECFc)xM2M!G0Z;cJ5eBlVw=KN=$FIg^s8!-xIkfUUNqzqb}*JBnl5I zRHB?Xpx6xWb69FXAn_M3>}%oVH*Bc*ce$ioDIS%tHGbRvFO6}$7e4Qn^6f{>k8#65 z8MHhx84r!RT@t^-Ok%z~X<}F(uZyEB(^+i}V@v*33Tk*w{x<~QYPuJ4!GMo|BY@m0 zZ)?x8!XCXYWMn=Zij;8Hm2wg8a4W9kq*hFzGpl?;GsT4~B%lT1M z&if65Xs;^}d~N-Xm$5pY$*MDPAJC_|fo(?P6TDGOHennV$hLZJdF^|s5YhjC&vdlr z_9B+-j21}0g!E{HLyk$q{lV5Jpv-!dphUnJ+>T1ud-f`-A)6aWfj8yenX`&u z&%%5@1Fi!8MZ^-l)Banm2X)th%zH^M`_!)k zgsx#|ij|iXB&AWvSD)wb=yv;hXTIH`zTK?L?dWp*dWZfS)qTAaWB7Di{5q%p8&`e1 zl=x2e0o99%Wi5jIQ(j(=?`bBba%a)^Kv<<~ zw;BMVg~H}rj_xII8q_bIbY3eN&WIK)AG;`aj|Ct0xN(DF@RvX`5VW_9w-2wt*M+$+ zC_Cl%N62^nh;)NwuYJ*VECNxi(U`Xia_FpX%UD6PwMuT*K6GAPPQN?)U7rVv42BgM zU+f+KF%-eSZiC~=t6qGOBy(*z!F9}2@oSYTSyo!(G=}nx3}yHj42SXfB6u(yOOCUQ4(AF~#YHqsBXdmZt|@dkhq32j=jlYYA@ zP=O>zv!xx=V@O+Zt!O*r)kuQcceHE<#bUPj>}nsf(#>xPe|Qc9_h>MNoNm&vSPQV> z39D0edz(JbJ+htGO9{`4QTy<-0a^o|nNYgV!ED<)$XF5OT?-H1muG}kgv?cH)_Zun zbJY#DLn5`z;)>XDFLU#w3cuD_jm7b_bDJifkdL;;8QXW+wNT()-@Qer1z{2ipM*L^aC zujusd7MS=3=CvIAHD9uGH~TV-t9@p$@E;>!LK zWczJ}PB8~u2NXFU*k^BN-j55H>+!4l9*ehRnWX5;8GP8fh!@CJPc)P8Vv)y55&v9z zzDyMUTzOgJHWuK763G-u1&yD8)Vd^=DV+)nd_C=Em7pBA_XjJRK&pF$6-eU18p}2$3pw{{s$ykuqY)op2*B7(VqF$ zbO3oXP>eE^a!OU$!FZtzk37dd$^r;6D5A7SL2kUdEiE810zzc{_bN|`w&P^h2RreX ze7D4^G zc{tZr3mrjqvWgTD7GSPEB($MOCV@$BS$C|tsyfghAX`p4`8n=Pmv^VPA=N1lPELqo zIK8ug3>qG?h6f5NHS8pU+V-Q3%WJBP1MkW%@GzoeFn31A*WG;*6Y1daVv=<28ot*=ykJtR$HzjpGcGYyrGP?NL!| zB$i7I^GpQS<^=TauaykzDOZ$UPqHlEJ1>Qtmoqs|=P9PGNOXZsJxAJ)^VZMvUb;j1 zk%)K+MmAediOSe^b72?C)2pR*YiPQI=-LvTHRxrL{LEz*tA3bX~`FKv#X6G zvWVgE^uAj@AX;plZ!RK-l=|P@jFJ=rpXpbFd>9G@xI+z;JKI8RrcW}yVX|&>mBYW8 zCU_K+c?EyTAZhN=ZotoST9i3IWoAW%mZ|%9s+@WmA~&=>xe9y+ydB!166z0V0r6yp z_U2@3By!qH9T0`KvaLPgz}Z%E>ik;Ao3orb4&}MBO+2GR>XM_1%;3KV-&ATx^y~dt zxTd+i1rA;#d_@+>VWgm5e_>)y^v?O908~J$znXm6G63fBJ)ltegHmKC=$)VesLPIt~ZdRbTkDj6~ZT2XJeNcK$7!X%=*oKMN)z}kp3|4I98g|1-OPkb_amp9E| zuV5a`80gE!tsL+J<~D#j^@IU!u4mpn+?u9=R>61LV)+1vd8BMxsz)zg*F+3%#s?FIfYzFQk{96{#Q>X~BM zxAwu&oj|C3M0d;95Tl;Z0;}O6EBx`)FINLo4*3>(9Y`ELv4=G$-r(Y56Y`eiRTYK= zImFaS)NPGttYI0}y5I9RS{5x1Emnrr#Ly<8_b837t6d?9da<&rvp zOB&+tyoTJY^AI;3+6!@nAA%Nv;N4mK$j8tUb-OGuhF?Q~2|Zs$F63QE_lwP%twFS> zF>AUogxp;f62D4YC|mhc?n2{^$+C3f3o%oF6F)@c2EMEtk^Dt<`eMhedx3;egvlgJ z=8klwnm|}VXjnzmn^L0KV6EPLK^QRv6?Bx)Qx+ZUullR{oh4?LEr|aKLhmCarHWKf z8va=RLDnfmfsZ9^>YA1~R^>;>Y-AxM;Fu8uIj;oFn+e1E{2H< zF6~e>_)9IjdvKPba~o0k3{EhmXN~J^SFf3JzB+JWX*bgzOCUixu?i-24FMsHZ#x{E zi-p4_qxEqMXGxhzFc&RE_k2~hd}=0vo?RNqT0yR$ND7p>ZnX=~_qH{I9t7FAnZmM^ zath^B{(D5KlPVEbLtI+5$7RrZ17wMoBPP&ap(1}|cuF%IZiHm(f9~4{i>Y9@Y^zvV zXsPY~7WH8+MWoT{ZIoO~gtxrVa_(a@B1s{3u5Y&E`tyiZ%qKv-5}3=nmI1K7>xF;o z@L34J{~u#(7^4EF3;!d35tD`x;H{8WjaXvOCAoCq&3T8(=w&9Ckmdy%-K`$`hOmpu zr+xy?--=l!!ZA;^8AxAwC28WjcEIZ-v{K>v332aE4lf-2bGHsi{NfDfZWibBS@*bf zxFV&x=oa$ACS>hz(l_T0a@Ssa;;1sm1x2C%HF(rd1?ggyw7c^Hc|VOVE~TJn#|ImMGq?GevIfK) zKAFz(2S-?nX&s*;=62~j$9|*gzz?ttJ6ykpwKAn&!(&gbKvCHkX;P~vD9*f94}+Zq zfD=yXepE|y&;wxrw}A*&E~0+#WHq^4hZQ_S*10p^OlzzcGmxwkrigvaoJzS2zHtN$ z@VTLgDxaq%doZ8lUWTXB5M*Yr;{~zC%Z27x7)zm{zTjJZ{Yy3USf%yL6p{MxLes`d z4dgv@)b4OP|1}$jByflv&$=gkP3M=HL~456imvRa)}$eBNq&h}i=$zY#b0ZSoB~n4 zon+1SvFI)-@ji?Ow7Tb+=G32Wj{?4lEdO*!Jbp=Ob!_ZJdnS)*{r6gsX zCPd=95=@WSns@*J00001ib_#KS1eyKfNp;hbg=lShwma%714-t>!w;16Z0THkQ7zr z2ixM5bCiMfRNvPEhH&oMZT#b@8cE5np&=#LU*KCk{cyYT01WJk61hhctsOW`(`smH ztIQ($=h?lQ=lyOj9C`~W^s;~e000001VigTEy*qG_g# z{~62okBe<-?Wg0>ouD%|pny2Q6JM-Wr9|`t0gjud0B^VQq|j$hZ{5LKG1gu2MrxNo zv(qi|>9rQ;OalRjh2a$S2pI7X*b!vnj7G^1dS0okEylnyaBIYLkvfoLudcQFZx^k! z-Gj*A_DBkclMCwX-HkD(9hOL z9p76*c4XOJzdaxUXi+xtk=K5INVNSw>-J0_2G=|<;ovF1(zp+*h5VK!Efrd)l+J~s z>fOS^z{%Ta_y{I^N?ixvk10?7QTU$$X;iqFZv6$5f(LV!vsdV=@#}EG z%T+c<{QR{mS7B6EVb67(m+Ijge1Nm1j{~nP{$!i!&W3g{t&-b7avKJbn@|7%00007 ztY@8Hos4PcEqh{R2z(evX%L}2v*+lK-zkISl9c1{nR7WY?l9RGXFaw7+FJ?n?axx5 z7I*#m7EPrFC8#w5XEg6X9*AGFG5X!lFwL?Fcp{0}eJYHxtd=Fu!9{#ESU*{Hu={iN zA284pEuH$nfvnOEFZSehpNS)vJ7wAuSTwXP+>?FhiKLyOEAQ=-rk-jqi@iLw6qKQE z-i{#ZxTlqr%W94EC(MB7ppzsmr4O&S>ZD)%%~-NV1Vm2cwcp7KyfhK6m$3~~1gKI8 zJ7e)6A7cemTClTw_Y}vB>+vSf_~`OUQ#$NKK{jQu!*f3R!QWd5zIr?OtrYbrkD``R%*IPz}qQwVAhxnSl(k; zKZu()qXbM2w?Ye2(`uei2MAwrtajKQzI_IN0!IrYV%qbLm_&wvo#dv`a25Pay7vf_ zUfgU>O^kiJp|_fvRsJQs+TmV?*wIEe9mv(@|3V&y8VTuKp@fv|5Vb; zmADm*P!Ki+@K1k^Q@XQT(%!bdY#tbzBLcXQe6$gNRn{MjSb>Cvb>&=)(q_n}C?}Wt zoDp=+$xzdtc>^`Fk;2C*`@QF&_kv~Z#%|S>QJ3*GThe_fWuwQYj?%{m)-x!(CHuV6 zHVLfk1b$L_wdc@I7ig{B|7JQah%T@A$4$m3aeR@*gj``fukBS?z#AwTlIKtDj_=_W z+7g{QJr6JO1@AgDBP`C{`jP3odo&>%Bx6NVoiQ1s?1CT{c#BMp&(%z%wgKav=dwio zoXrsE`4|n&yL0H}Bmuk_Pv#n>K4oJXcC`Z?L3DRNTk@Wa!OQUTB?~odpXW3VMV|9d zOI`%iy=*(d&N*OK65lDay1P(}ndI>vDRgm9aCPq1WoR*_&azqt6_c08sL7C@*(VLv zswB=^sx|0^V#TrWy*y^E0g1ng`640}>ncNX-s;sJr})}_0Zkn-UjVoh`Tm@$vm^S! z6*nvPUbE6A)%4Q6OO;)yOV<~HH&zqwSHJ1eBL#H>L+D0hNzceQ^-|TC&LG3mog_*Q z3*OJIfj~ci(t8*W7mg{5R-VK^mec$=BaEI(TLenUp}3!Iq>#2UDgaE;(09vTfUQ9Zy!PJrr*YGP<7I1Dc}Z2D(k5 zF$9qK1xr;gV#lj*M~_k3$kV$B{27gbDOkn=iCfti84EM@=~f~@L~LjSgJ%g= z*u<+9$j&8}#Zcd}v+=qPNJc&a7|S_fQ;mze4i)-pQAu0dey3)BNlX7!jy9#F>vQk9 zr~eqa(Rscf&{fDmA4Zh|?w6-o6vQRU$(eqj*nXOYnDg4gJR_B`^)(&{}JnG=L%B}9Q!s)W>dXPFW!^>56Mh~_Ri*7iII|5WMKLd!NfUh$y{m1 zj<1GH>rKfoYu3w-DKl@W3ipXyUxNMG$yQ%OMBXY`68~ZqQ{8aeSTPLauJ?Ct-I=q8 zlQ0i@iMFu&DLLG#o|cG_%UR|0jXLU&z`Hav4k9F|oatez;WAXWaz1bKK@)%}#+kgJWI~9vei4k3771@tBeIbA! zUD?Q)3*yXOW59SKR5?VvDtYsfn`)=v8z{6awmUGJaJBCGhb2xDC#=;pVenvO;+gZp znYMo^=iSD9e+VAWP=+UoZ56lhKK9;v!|Eb( zgI9Qh0>~?fH0UVu14naBzm!c+eOLIA~Dh!Wu> zZu}Bqplhho^{i}>alNNYXe%Ov=ZnvR`{6G)>%=m@;47)(fvdlC(n8g4Mr|8+5y)oksfX0bm6$_Wo9yJ(u2Zimy1zFc;i=NC&* zsmxO_r%{1~HK|wY@X(*S1O^2q1W9ED)5;lifU?-5`V{nTsk9$`s+GN2XY9pQy@-KG!83E!b&deMs z9u<_D%@bIu9-+&&P#W#L>V9@>CS(n9Q0A@Fkgk_9#OAVpv*blFusc?h5)jrF0M@B< zZ<|u#df8US$krc1nGH)M+XSw- zakPJ%Z?b{Q#O<_B9L}}meEzS|dHgYG15-~0Iy;BZ-lkK(K z_6uHlY{6p;QS>8_^N(z15#f9w?x~tMS3_3OO=x;AIgZ=yAkzJ+QYN4w3mO%waGyjiQK?>92v)**b`C9ztF6PXocm6F(3wyM^Ae@-7+TzfM+qz3V(6Rm zLhX#W_otI>mE{=A#!PCd5InU8?|q1}1%#uLfqA^c5Pj;Ir7FPe3aE%h^ox#xDwvVtE_g+k&b{SvvMNuU)IXjJa4t2c0%{n3^C}U&74= zWYEG~!eIzOxo`Wc-C~ddB7-&(J{H2`o)0jCnSR1GRl-dhL`r1vC3XlGP%|zoFzkNs zAiK(N53uY87mPQueq^&~|3019_sa;mXUi`2|6JyF4#mQ|iOOK%pyjnXMIvc~tMeNp zwTa@6)zz8>Nh#(|1zUgIG@in^U*dzQapX2HVc5&H*o>Cgi@=A9wk}-g@HSnqV|51X zasC?NETT^o%spFwQZO`P??BPH*KIqe%F}0KTCDGo`y~w8V1$_>L}^pV#Ub#RX|2b_JpV2UVBcV z??4SCAr|fZRX`iS(=n-!9etnAd6MEXGHb{_4vf9ABB!z+B^ay^n~@eq7Nn`OYxx$; zVifZmD*EBgR~TBej9n`ZzDX*u;`l`N5zL^F;+KaB2s)smX}zoW6QI8;%X=tqjDDIE zHOYTi=fNB`L*+I4-iJ2Ay6Pclp!bX6vDguNdMuTEZH|sSdk!VQ8ysqO8nTQL@``Ik zNu|&>U+fmy;#RO$C!ll;i}MvDwPyh+oV9AqqHY4<*>QZP)FelurhnBEElP~q^IX_+ z=m^+gK$ZX6tyMdovCcRm8nB~VnR(vvu$6hKH0)Sa$z?3wVM;W% zdzB_dE%5{Qz4&BM_^`1|DLx%Fe3p-{$Ft^H^`upepIiGI%8oRyi|)8l)wKIUeRNoP z!vv0RJITtD!r0)Bq7V3w#WXP0G;f?7#_$kb4B(IoW;%-Q#k5X$n$Le5ZsFqha zhU;+=hAQLqm4io=vBnX+&0jYZq}B!jh+=6utVItLHb#+Ae=wL&CUWYBgV7e6K-B3n zps_tIytysRqR#{)L(6NP^AbQM8 z`*y?ObXN*kE34Zg@-d@-LiSOqoX^imap756Z6y5IxMjnMI>Jr(8Ud=)*K|Q%6}>3P zIfigY?dI>lZCAQMTA-j!oA6K(AG~VL!t-bNT9xJ47r`otKT_(rSXkLn&?V^`_{^N5 z_ZDrzlFrZ=r5X;~-cMf0@6^qV7#Oe!rR9tjiVRTfcJ8jdaP`a1M{cz3p5ze>Z1KC) zezVuj1xO~iwgIXYRZ#8NtCS6ZGn=^k*2)mbv*VoND9eL)J~jz802&JdGe>Dl7Gi1I zlCl;jU|^qKS$r9HEtV6uxohtJw^WA=b5pl303fcay`Um>UN04smm$)oRSUo#+s-P1 z<$KJ?^ZOk{mPd7^v6hZjjM6RVRiIv=xF7B)}%upc1pEnz92I z>lSsw>CX4LuRszvDWyDk8%~^%?II9!bCsV+ScU;M4D{2;Je^=H7^+TnUH*bNC`qj} zu|%)r#;(AZB4ksbCR_QLW_eE1UfA~N@KPz9Vm4D*3!44)6&er|$H(U>x`e{D|0QD| z)-Cb%+@2~CP{Ez_Pn0Jz#ZLZ2t7uCVHPj7Y1@?)h=${pa3k|sOLkG_jaK2U5&6l11 zxx+)|^3x`;GC7cGcv(ohD$o7h4MA||zt$RczhKi3;|OFvwcSn$Knuc}Lqbx2xC`h$ z7dWDUXvPdoxjxQSVpT9u*YFla2dYfasUcQ*bSV9(gR0cEi{Q_P9AlP23&$36Un$0= zr9kRLG4^x{27-t`Y>u$|ql}BsAzKVLm=}Qfyshi+oc+v%b#Z7SiQOBombeIlFO<`b z$2c>PH^@-Hc{8oSQhX;rFeno+=H3589)yNly5oa-m!&n<5+=9u^JYc2YJf#u0%HGm zI{k#AMQdrp>T5cepmgDz$ECyJOnRC>rt6+Yu8Z0O7F&(0Q7Y%QK&IwW#uBAa#@r}C zgf;j@1=dz0N@e(A!huf22)j1TF<-pf$8YgrTJX|Zu9*KD=JUrOT={tj?=xJ3`2*3+ zA7=FFxlu<9mf~R!$!k^c?HhYJp_WP@5`#ZexX8-ywGen(**%o4^zOhZFJ`rLHYVc~ zNeR|&*4Hps{=3g<8V*=v(V^k$;dvcLBmQ(yV4~#Cuq-$-)oD(sbVaR~CPJ(o#AL14 zvxw*cm++o;6vaa=cK>r#!Z!HB-{+$PYd0ZjTrdT>&nOsGjp}4$&z`U$n}?}OtG8(8{FSN!Qu+ZkcDBeF-gmum`abN2Y%34wzHm}&G zn|rj1y`V?+-G#{K$L%}o4IAfeMI-j5>|R1cPhYB7%~dc^=2XfE@lnL(GDw!6qT`^S zO^SXAQ|ZWa%!EGLNU{xXP)l(`VT|cG2fNGA`a(T+tNGxhY6l7zM1K#%z3Y?I79W8H zsP&Y%xE#t1r-kpM%4oHn+BCCcgKVGk{4MGARQ&p?f8lQ5ZjR5ZabxH7g+8s1-?pi~ ztvci9>VNRHziqesXv^)SFSg<4`)<4Kt9R|He{I|RH6HtS8}{`xeOs;HZEttZcYydBlg#Eu9hh^SYX&cfNDmHI?s9pDg7a=HBwmL=I_@TV*KaVfxbuNh zr`CRJKVMzf$A{Mzv=hKU6}l^c5_Nb}{7ax0iV*Z`ChoZ_#iBget>WJ;P*qdC&-!0a zDIW#;wh%)rR!X`s&;3CgR*o{OOQV?xgPy8O9TfZHYPF6qU%2=72CzsPh6h-2n}c!t&d;#eoXwat-aGAbZDUK}roP)jQ| z@mGKtU8evK>f6=0-^qZ?Z!{%nnMhg`LESHmM7+6{!Ng<+my$2Vi<+7-CaWh0LjPDJ zLYN!viT)Q=BAXwTwZ~B4ZA-XZ>p)|a*cx_(@yFXS^s5-?rTV{Pf||u~zBuxg3*}Vx zjHT%VEAgm)GGrt?Pm^ih-wbu!0tE*mi^&`F97|(A*8hK5{$CMSC25iQLaiLJC^x{N zCGSD3O1fj>+O<;Eh3J47)`6PIZjWm}iwshhw4qV5Wh7ay$y>Q6~ zVT5vLvqUEnolny0_jNe*2XH=gYCRpsa2Bj<8Vpf*HDtkeC}%s%uxK3lT#7qIeS>&w zxUI(S7X9q5Yx6MrQDG}gJ{ODg#4f;WsuiL7ioC?(xPUysRLk^bX=&?&LfWNTi0-oG zYr4oVI6JxMc08i9cUu;#C#?=e%FH1WYKC_t10!@kkkJRXMmCh0m0WmZO5$ZSsCIk; zDx)vbW47X*w+-JZlZY{6J7HR5^Dx8rvHEPV2PY9utNq-Z6E)1pR+n~e2rEUQ&kH+Ypy@5P(U$;fJpn^ClG8nZEkq) zd06BdB48f4P(GY!l1$Ab>8P?$aZOwZD{U8i$yRPRSoGow0AfYJd)a8_SqfQOOu|KH zu(=;b7N1P2_}PVb?Pe<7S7n=&r42;qr8>mGPCk1(WUuv9#jy~=Vk23829-Z?iPt=` z(DQZXzZ@iojlc>FdW3ia(>!4!tDA^pa+?;D5rJk1)i%o_sB0NpO~4Y#A_**!lUx-@ zYe4(lk%Yz}*NJD>^d&5xQIDKW1t3B*A@2eSTI1VcA_ZQ})q;dXHW1ouSTSzSr*jWt zHzz!dk3S4*cJrSsX=1xi+s|!dBQyXh!$CN$`II-G^}m-|Ut25|Lo*{bU#H*yWjV14 zc1J;1K^UJ~oN_C2@NK4a_4ejxpkO{fuUavlCa9XR(!+?RK#OHN$LG!TI*>zi-VY)FCy@HWwW@Z8yOXg6MsLP)`HVDAM`AB~Xl)Bb*F8 z6Vx29eF^*2LcHS4q&MO)bxIC3aIsX7!w+mdbjRaP#=@4{J}v!}bmU}qkT$YQjN_QY za#O=G3l(PEH7*^$K91$~VVzq9H;$5%bJdf9d1cxtz1$B11+s3F3Fg7%v8PEYq4XPJLXgG0iv1C;W5J zL#Yv*cXPaCCnEI?Qd0?f+PTNJ>A(QpmiL%#DnYn_JQ-M0JM!8Juv zGvrooHZ_(VzUI=AC?4EI;8uAfb$hVG*t|)!fadiYaQd3$j5Ww4z#sQfE4C_Ea)KaS zOl)Fh@GSY(89N6KM!sneA+!;{+@2Zygs0Z72h3iS zR1-p~ymdKmf=fXvAzkDYH6a3}-(A{U-LG)bSac8+cV9HoU`6$!td?hOTgSKMvakPt z{!5l>^ON;q@DrhbFZ9;7h@4A6_}szkbOk>Z2m8)ps0yMrkojwZwSo{J&O#;oGMPB6 zNl|128y4BTdvlMW`7l@7Ioj-a%Hjb2>vmcv!+YZT41qrZge-nPj`!07UcO0`{*)}Q zwJ4_y)w27y%hRJaYANp9=`nyM?_d(6PDek0elJ~wqw;FIT={haE?$U@Gs=U2&~o7G>lHHED0>9Z|R(u346ZLMumMta((y&+J-6$ zRi=6UEx~Bh)}NEbNt4}wOLL_+1m`YiDF}j7F=zp7PGTd z4}M?UI3ZNT!0JmkgxN0xJHenayUlmKwwn4d*brQyZ8sp|WuvB}hoFl7BY3DSHg)}5JGiYM>D7Pt~8ojZ4_VyR_MvAeg#13!rUB$$jFqOl<~SsSRlN8QekCd`4-h3AYR+V1k9u_=Q<}Df)Es$#7WralbA=2Pn<% z+n(Fd@7CMWC`h0GGT*?B_&tBjXhk0_WZh@(JZ>!%u1gtp>d=yJ(NOZjP!3n1*U_hs z_!wInmn14pEUTVMj5ll#4v9PK?@u`RR(5`RZC&ldh_q<-Bsx#X@~fsU4Z+56k=rEB zW+C7;M06z~M(Q*Ze<8xzpxp!>_}dT-P#C|)I)e-y$_=H@{Wt{XVj)&}-D+Yc`sQ;` zj4Iok#@b-__oC6b{ii1%rzjG)t}&?nLrWwltN=o0diDwyig+1Qdr2!5OaQey`9BYq_fhE@*ieM2KLZs@aX$ z5L8Xlow#7^-zGEH!OUr!B^=h*(A{OQTAQ5Q0*MiFv6H4hTj(PNzLB zTXg?3r`)PE<<+Bn5=f)zGtmYGVO>qjQ#6Nh-)?x2)13ku)hz8sVYjECE)aqka?$J? zJUeJX>%u7GsQmgUt~{K#B;9rZm{FUvZ3jy1sk}@Vg%?^(?eChiX$0yCZkioW{inSt z&U|*iXv=kSZfk}o6A;H{N<}>FNee_%Z+xaWnnFX`LVz4Y*vb&|g8Y`o9mNO*8z;LO z6+^R_>HG!2aExd$cPyOEDIx9vy9wBJY=gj*wp%#?pZl4*1s$@@Sw9 zR#I`UlnpV`YFSf9_u~B4HH3K0g0;ie8fCkjGK@kAbmJkaaTfO}bXH(|#25-`M}EpV z_7^t9%8~Hvys@cC;K+wH8in;JLYx)dh)EI8g^yiB*yZ*Ae~Y3Zf2Zg?i2xKJC@pFM zKZjHUzr14X514`Vz|j3=l9qEfls2GJCZ#>rkw(6$q8z}_!3FGHr@|Efb?FdBhp)== zkCy4xk?@cO+3Y#(5PAhyx}$>FfB1psq*ECGK0G&pcy`d4JES~w&N(i`UZiTrBSehVV|1*8o@mTo(vtjw z4oFxj&{A3?2uTcKnzDGM7r2^u@G)i*ne=m@d~Ksm1A(hrn;knVzX05RvRig_InxuHRtk9{EN}f}_F& z;5Rke(+4^&zF4UL2MBS7+aYXZt|)?^KGGs$Eh{;?f7kpzRj~V-nHLqGx>jQfDhX9%w~R z{qc^Df{YWeCTzNG{1z+_`}|=>sZcZe?w?Ksn;J38H#lb~7-jzO(>Oi|Vf>cg`H50* zwb5l6w79FHs9WLIBtUt&M+PG~6#An^K^jKGZvoAiBG8`8&FVL5J_)=dTm(5O&*wu( zbi&|3Ohj@fuTINuhQ6n1n^d`BdNEK*8*`l+)44KpkFL?;au#9}p=o%Na}npY^q=(+ z$W<9^ICc@p&|3Yz1L=q*^7aZfWH^9*KmSvC&D=1r;Uld!y&nGKH4D*+YbOMyke7CFPazvXaUga@iVE25^L2xc+COmd_ z<63&oX~FMaJly~C-G#{15HIDM?{mu8iN9IP|)#`i*=fZ4{miIq)CXvJZbz|)e0lb?9xuXug3JByO_okLOXQ21W6+R+ z>E&|IlP=cr>i=oki+w-HPGB*?WoIlc*e6sx?z#U$VrMhm+ht|6><@HaC;lrd#px;) zN>p`t(F|oHOt9{A#+&)nk4110pQv`Pp^+NizMar$UZgTt`Dl1ikh2tO+)JlomkS^O zA`T|*T;Ba>-XQKZ=4^1-jNB00LF$s}V- zX2%uyIpdE;_(~|4+b%Fuvpf(cKPbfWD}L~tv#JU!jtqa==pLeY-@$grtEe>J^XlNK zty4zyN4;};{6uwy-LJLyMbQ~uVtw{E*&9jL%{0AYJso$4F5>GTZ1c>l0Y=jS!lmK- zZL?ZL_9Szgj?h81_^Disz-(!SkKoez^ZiQ4A*KW|jyl`yybdK#j%?rTsjzrJ|15w! z)v2IpH7-;?S@&DXKKvUK9PCgrudJOgW6!71h8-bfMk5-vZ|7Gpc7#&2$^m^oQ00D1#72M-RLl{|+Qu`E^QN-B3#NzSvY%cd>+?mI6zOO{Q6^-ilPd45wd%G2ZEXtIN1~;kDDDv zG|^i;R10p%36?=8;@jioK>&MXIaCs0N4%=-FDT_IaznM#ay2!&xd6n6wP6yW$PqK zS+U`^C$puewa*xuc7$*<``Po0j+@uA)65F*nISf^1I@mXh4IJn>A2WJGZ(R5^dU@teiysz zB5i>QU|%gPMnN1O2dWe+{Gh?%`~echrS49bu7H);gALsueU(k}4!Iat#b54y%re=- zl?9)X0){mlo?Am=AP8p&LnCpDRXYkU{E$Ki6%@H$y!B3{vCn>0qb!P_Z#H*sF~#rRrE`YeivCdzsuFg*#z*?Clp}fE#{g?(kyKQ&4gb#*F9<}Q84zqw)d$q ze`QL2NjhZ%zP;n7Jm5&~Q-vmh9pU#Tq3NYTSg+fKnog+o&Qa=tP6o5|T*jKlF-29J z(V8M!{#Jb9_k+io`r!C$%>X|jvKgLg8Y`6!7zdtxl}g7Px+VJZ6P?^t9BRff%0P!U zbwga1l8xm{gt809-RZfl(fx@8i-|^rvWVP&lPH-TF`PYR>p#?R6)wKcDWYAC6|%^- zQjbbJA`&W`rXT8U8a;blN_J3(hJhko?6&55Du?`^ppcY_&Z_Si-jeQ%Gqq{qaQZ@2 zcs%=<9GAPPHU|8p;Y*!{8h;m?nnPJfC-s^z%r*m3@C0`{zQ3yepc6?B%A17zUvusM!a_ z90K8pesDFq{$QC_TB_^?t??&n_j#~)~^oyd$f0E3o;cmorx<| z#YHzc^Z-CPukAH`UB{klcc82**feyc8|o((?i%DfE#iV8>|~dI(azPNSLwq4X@pa! za)`2QmpmOb=8!qVxau z`9_CMNR8x?)AU-N|$73EqARI(zeIzX0)=kSJ(@D zx@#J)o2^Ekk$)^cU zZ>RJ-yIH6n0OvjU4o;13kueEjmx;%=nk+4|m3D37IAr^gB3>)$897=6FY-5z!sV=V zr}kSup#%{Qe^+}_jpQ>s#beaqG%Z<)I*a%&D4^zwH)w41QbrgYj*s~#}#q;qS0pPR%BjjypbVTk~2scyg68rM^>lc zY0S$dO~Ol(Aw#z;h#PhPN3thm02+~it=xnD@?M#n>(HMj*E&F!ehCYY`5%5Wc&a$% zxL1)t1R@@~k%@pl2a@ho0BPlwl2*bSF~^mQz(`a%PGCf@9J>zk(v4d6C-i2xLFNRO zSW-H?z0h7jWWXWQ{GQTtlM8YTWG-WW-n*joirtktrhm-e_0#R|aXl+lHqoZ^5|N0} z;6|1;LMH>vg6r?djQ#`ve+v9S4CU_AGg#-EvZwz~L4YDmhO|TffB#!uYE0Ju1YOjf zQPxD-5G;t&Z*bHrW-gkyS#mWa2@@()WNb!-^UDWl!iUa>u3~>uN=45=LNWCCp99wrztclL=iqBJxr3D+={%l5yfi5dcebS+eOaap(U)AaN)O ziwkF5L>KP;A0tjd?flz1k;$fFEU6GlWm32FAi4N#TmJEacjeG3XaF;iY_A znsM_GK3?C2ivL?)HVIg=dy#)e0aM4B)vHHeJmzu4k^dTnMt9|j>3Owc-voG9$bnDx z=v$_MrP`LtVlw2Zv4`a$0X8H#~kJo64CGLj-u@@_SKQ3Y_|_FF~6>KmULK zS=7czz){MKP?$ae{ypJfvjVnP1#ws86cB}isbpvELnW65uh~Q`>qQQi>0&F~?g()q zC2n=}2JH3##u2RfEeegIJ?W%X+@I^;b;<5P1!ETSKRjRcxAmF4)!Ykn!kWf6KZXrm zCMBt2bSi~@-L>oXJP{a@yMvQV-AVd8knmw&qq%Q=+)VUHxU-Ctg>2*qHI2(2G()DC z%JWOgAj+C=Ct61wT8K<8sxy-B8JglP%f#D|H<;r=G=d1QFAdmwruUl4qS9J0A(>V$<1i)ccH~n(s5vCyf*z;Tb}? z+RNU#ix`+Iakn>m_+*_^kSIZzrQ5b`ci*;c+qP}nwr$(CZ`-zU+t&8X&c^P}MCDUO zWJEqx=3kk4zH?GD*!RBAYcp0OGfn2?tMWtv!^ajalI$S`PfY4;s!k<@Cgm|URjBcg znv42cxP&pMeLih;P<`g?vVd3{C5a+-RDR@9Iv5BLa&uX~JN?{}+x4h=R}k89AGQZE zi$4TdROqw6F}C6K>LQgK@?*5!0g!f08Fa7z^2_wxMpRCF#?Z7)rBf;2;Sr5knQp~k zZOd;Y2)Ua1LjD~OG&aDiov8bJO6Fwcqv1aijHORZ>+?E4fw<}8*z489ZDjk<2* zNl%Z3m}!Me!IYWCg9>T?8U&9&&`J(kAiF(p?|qwUilC!V$}-aj<2IsMinenm?AB$L z=D)|56cBIvCrxR1<@d(yDk5Y>v*cD_NWYKoOKnaxdp1HgM=M~ZAfZHdGd-s8$hBW(p3h#PUJ$e?iBDooL- z(ao7jx9{_Np8n{{m_+}%OT=)yR2HXJusr-&bBN(5&~{EmyFwPnOGA5q@X|PU7HM>9 z4x{rkRBR61gpFBc`?YXc3&QFS>xs9+^s-pgC7PdK1hA*BeL9l@g}s-B1F&LA?AITJ z=mCmuFmNleK$QE{+ujpgIWJ zf+QRkIi45kaH=_ceBlZ$0&W=6Hn7$EOKqn?9Hg~JcnEV}|ujY>K z$Gb!zG^ew;oEZD^LukuK8Q%0o%tiX(hA&s$S(oc*U>!WrL`y0a_+iQN8vO#HIiv>b zK%aNZtghner29xA?Hnh86XMqp`CE7sUJg!vJ6SQbOj2s4Ktol z+B>MS{YhWkz35S&`lW2xo2l%eyKKp#H_=IAtI*fPEzl&l=cJd2v-#symxxz_*IlKA z$?y6kG%IzNN>0r6tDoE&-Um^Mq=yUCV1PpEnx8MZRe>|IX?Q-%u8Tc2#-{v~MCy*lV1R#Fz)SoGU z$K^>e!3MtmPo0b{&Mvwyg{n>D?y7>das`K*1Vws~tVS*FUVD1dwiv63$2=Dh$iNrW zmOC3gRXU>C$hBb&2w!Fjn-u)VC6anQ|5~AcfFj6yZ9d{aaGW(PUS_p=y&gMVo0Je5iga) zl>~;A8GtY~)2SQ>`&2+gb0%GLmP$0=z zH(Dm-pnf3Ph6t1rrC_!FVn64g>4it2>;1e3f|-H5?h$JZTvYc#f_2(Pi&i{>+n{)o zOMz=sR%KtHOl7UC!qM5=+$lGo{+y@B-Gq);OaP4Ji>U<_NUuOAngRUge~^WfV7 z4+QzmQS;Ia8L7rDiA`wc6jVMZZ2@KH2x!ML>UBK>;wSx_lfN&K)1y>5%MY|UKf#QR z1zVyykM#zoSAET`b1Tik(|q6Gr_SdNxCTB^+iC|$XG6EUPcr!8q}QBv+SG#L-Nuzu zt(Sjl@$~OaP~Ayb0L2;np0zy05*O!`nsmL&Wxyyn`ik+Ygn*JMNr?}Ssuw5`95L{U z1+B-6))-a1RsfQCn`v0)(fz3q&J|wTVQQF1OlTh0UO2{O7V{)Wo5KfvxU6fgjnmky zM^<}1!C_BHb?k;}SuF~{l^zIRqlq8;9Du6>iDJX-f-k=_!k&2u`~4CAJ8@-5BYj6!@?cpk?X%g3uR%)udOUIUgN59qhDU_zDzWC(JQ&B-tXB|evaaGwDbLeHftn7c`P6(z8rqWVr)>}{KOll=jh!CF8c zbkrIj2uongCg_VV_+m;{kdDLdQS^hVV)@Gr?a<%UB&oY7BeEGI?zsNi0&{G;EIMgQsPKk+G@~#phMzizJWjVs{;^t?n1+h2g8* z)~VF!jveuD1cesz_XLa3Rc;9Is`xr}HwKYbGztCkg5D89Mq%)ib73~dSaman^(lgO znwyYJfKjtv@H9WJF2ZX?rrMoYj9K_(;^uAbnG%F~_REt#HlNNWH)CmFRfic%E`->q zQa#|&Olu_9S+Ap>J+2QrEIAzKl#50@YHK&)ViPFfO7IShwwtJpX+;!Y5V?d5aR&5# zaPg+sJ*;=B2fkAs>oWdU6*uioygj813w(#ZG5@ss5=!B!NqdpCV|-u$674uaAi~r} z*0#P$$+Sd9zfeDY2q-# z(UBRUb%_UGER{T?ISXzyx*(e>ih?p!92s#YL9}Yr&I9_+ZN)vv)=tn*vWp1RZ98~t zH;|3*gD+aJ-lH}Kk(9||fb4@uFNS+g;Oh_UDbN&nSWyKcsGR26_HmYqFn;H=X9V;i z>TXJcQV6iW7jO#zyCYnj1D^EQ$}Q&?`2%;5AuN`0kNn@8Ws5>5KApN;8FOT|Q?X!| zqyz)ibo99gaEPh~TH|_^MO5FfYe#0B!&`$D_S2ibkS`4}UwglT*~U|fZcG(9!n9YM z9koT6eE)xd#!34N-uwZlqs#hpwz6V!R;wf0ReCMzMPS^<-N;Tii1&{_2>Ydx>*|?; z2Cuca-&~P2E{fh=(G3O#hDlqpit=2i?`D=e8$nK?O*ivs(W#Zc3d_TBTi4a+Y{ILq z_xv<>OJ-Cr#~O8$K!jdHB@%*iJ~FZM!T7>J*|1s}V6vc&AW#@|8fZFQ zcFZK7Yx3Rx3jQwYTWX^AtU;DO6-mWEfDlI+ppKlp8FxoGF4;JEP$~c52&#t7uxqq} z?@o0V_4D zyS0beYm47?fnCz=?LFr=bxn0Z{5m(hDguO4$s|ip?iT{yuc=a7$-wJ3dGfQyAB#m*EJMSK7P zUR;JZj-t^n$c&&AwuhC{xBqoi?vcFW3=ZD`J%3rMoSm0syC<7AjY28WXy3f0+REy8 zOWMR#v#qxe*2#W>iKgB_)j|49sR0borMQ2RWjLo5<7v;DNpO}rmm)-2T}j^eVm4-p z3txsWTM2m}?e7l_1dn?3$C5KVe=cmoc4K9g;(r#jug)o3QJ|zmOtcdR=2lNfU;z=+ zHRA057~a3p>FfS#XBjLELwwVw;DNB^yBBr|5~X+rjq5)^lO4S#7iP~=qC96?DT4Y^ z4}1b@+8#5%xg@AI6vSE`J|Kmj!v(5jd2OtwE?MB3X!`4@{%DY`>DW9M5o>_v;qD~W z7@ovRA31>L!u0{16DiI`xel{hR3QgFrd~FG=ZR+*XFXGs+TRK@kyUuFwU7@qUeKy0 z4+h9M9^--50gxMsnrRd$0S#Hl52M`2+Ev{m`%Ph>_GJ6#u1fVVZ#-QbBl_4}E4WbIa+cxL7Sy92?Yf9lt|>HL^L9piGEif2(6*Ye&3(3r*tGU@rrMm{EGX zO4qWOvwp(7stmmn$1?GXz4N6)zL{>yfi>LDjD^W*?u%7IS zvd!uJ!I~Et_NG%)U@TPH14TyZZ({g{h}-(2%tnmCf-h;%08t?cly;Aq3cIV3l@cL) z*82zIdF{I7aO|E)`0I96{H9B30EoKgOzv;f#8+s6pK)a`jp#UK!jP!6orW~Q2Itk# z3lLyHbCeZ-nr2x}EFkkkUE(se9 z{riLyHfa!0()L4-{M_07KD&)OBfB&a-Z%aSe1;&$WeqZB8-?I)-6q+^6;0IG^#`Wo zcII)bRA~)DXDM`y17QS{tDD-K=u!JZsDlWxqbD6d?NjE@i%@n@V?C`FJc7;aM_}lkgUQAWO5H@7cW~A7cyNY=To&Q985T{OaQZ$L2sOD<#UT zJ}6vXg%+j-Vi4{d%NY2xYR!m|8b%WZ`v^_acM1h5P`m@7zj4`Dw@N*kIf6hEpsI!! zM36cVfc$vr?A0u%36H-nR2`xeT&<8RaN_{&e#fG@<9IGN^lufk>jHZw705>xETH(I z-5Sgi^A?E72|dn6vP7B+&C}c!GxTX}wbZ&2Lo~DZdSE!umw9hH#hjv+L80zOqPd1J zOg?Y#N-_xb4_k~=GdfCkCn*eWdYok7fGbc{1c4CJC&5PT4?Q8 z1I5~(<#ggD~3Y4wp1oT4hkfV(cD8n2>=CJ4@f!^@Rx2+tilHQV#F>YOU zGPK+|aN{3v!vhMy;9cpM-zXK^H|D)Xg((vFgcjo&`QwqLo(z?fo<80Ktgs%ymzlA( z8aaXPN3X)2aq9|Thd_#nkB#Uanfexg(`iO4SJ$1?wqFQi_s~ce!``Z4j}He5 z?o#vgtW1}|=3%EIXWTu5P^^K?I%XXhS#T2hHGlheZbO9{AjdU3yJ?sYOU#D0ig)Iz z2(31IC;HhDzBGYV62X}frtb;pvn;a%f^lOOJ^XzeQ+@C*@A0)B>^Cwn4_pyOz7^`* zMled%-cFgss?LcsTG|k0CE`u3i2%R307H|A#l6|&4)TY_3}`4p7!HQ!~Am8y7kWO&DlST5J;}NxCHs3_Q`&TNo5>!nj>s`Lf1LD-;CV{VK z#PyiXEBXj;gi8fITRop=R(&Kuiw%!=sUVh#f6!LU1(a@5&RZMqtQaG5(MWUNkdG^U zJ;G*85?-q1bc()sI*hDEI1)Bu#CM1W>|;-IZWPwijq$4ddXuuo1w_l=(Rw{T5(NLM zSRgXWghTykJss)@L8onVof|Cjd_dw_O5a|=B(JN#g2#H&osyqHNY|DWU>dzt{zgS{ zj0r6R@KuJUg%IK)Bu1f^CFFzg<82Bgv;xsD(6H$9z#&21As?>91UJ;Al|aXpT&eYk z^5A(xOVe)T`-xb(!)R$F@g!O0AFF$AV*#y;W}XsewRS>?H#2OJbvSft^Q z*h|z;p4SRX;>}y!faCqc32FqEM+w=X%w^-;>r9j7sK%|VS$ViMr{=we!FYqr55SOf za{2j){1_;EL6ssht|wEG-49thOCLTGjWGH7Rf8?d_QSog-sHlO1~SIN%lZt=&)Yu~ zO*p{$xO-}bVbIsH+f_&QO8CyLX<(= z>N7LP#<0!mNzap0Ug~)O=0}rrs%nyIof1;d{B=>1h7KR#$TNN%#ao5%qhY+X-rV5U ze{mWG^`H7gQ*hCzHVZSYGp*?e4Rba#T54BF2U?$ax*zcDT3BX9*YO?2zwZNrj(({%?TU`9=KRAsB7WFwGZByo(~vl%83 z>s;m|nX;{@J+J+$G0G=-Fk9(#jY{CvT0>bXNMBwl&;kQZ1bay~LDQ%)nlNKDs){(>w|{5p2rh$l z6y%I~ywTtvmX_D;U)Q1CUk>um0rB#e6?aqXKXy3JKS+O(QgOjp>XS22AR*xOgS5+L zb8MPe9XOrIGkl@e#!)e2dd*#sGKr<+rN?Td+-Sf!y9UBj92Og_l!4~Rqr(*o1j(>3q+QiL^ANG^`Z}IeK`7U)JHkNn zsC#i_B(^Fh#aUV3-ROY$aS$|G6r+5F+G+hsxicYm*s@!nbmWGM<~joSv|IqQ82)rCmE+zc&%XIy{uJgLC=?iJ%ts&~&$)Ia1`nX>G^IL)28#h=J{SVyXo=+RyZ`@Vy5b0h^S8~W=_j%39KlfwlsDkL`>J!|Y|(sPS;-gYH6-_4d!;v_ zjUX=G)Q0*(3XQu@t2~gUTs<_ z=4Am#Agb+;|DCEZiX6Rx6?Y?E1S!~N6Pw-RZ7(t>lmneH9QY$SwyXNQMLR8spS{|h zSm}11Zj4amCg3b%4x+8PnOBM#8f=iSd!2wujkxSxk!(W(cbo-*89ERaAxcH?qxPT? z?sExyfVlHGlWzZwn|BWEJ6!dqp<+JRU?324C3l4MhwgiBS&qR|T$edm{{Bl+@7M+z)K7}`8~b+v8xDfEaO zR&p7%d5M1@fGeyfJ8B$&0TmTA!6x>c1JolCorqT)7o``p29t=EpZ0%)p}(W|>GnbphuW}+{58?5c)F5Dg;3g>?r40EI%g0B5-cA>@R_VNCiY$g4 zzir&|0+Px7{P~S=yrjI(J44KIiC2cqiL0L8eYoxZgI@`6;=-rgKC3Pir05-PhJj?e zikfVuiUo06o1PxUf5_8eF#=#0!)&d=3iLEnSS7rX9=uT88;9>k9Ib}pGI9!n-ZK|q z@k~`exZ5}2-v zm5_`f4PmD^NwM@iL(O_Pj1Zp#ZIY<<(~mpd@+GCzEW2&QkBJ*TN8BI+yC;^Q6#sHn z-U({^ethYvqwD0I#Qw2(nYi6`|H!dF_ACshL9h@db|nyxF7n`P+&jD{7i0G(5xbv; zA=%gOB0N~ZIWMaKG*zC~3+d9O)jX`K8M0_1WfoDSpq3SZTdtfPUqK53x#6Oa?ZxI?CGbs93J(J$L z6FFj(Rifd`tyXAWmqfVq!$c*bCAYY)Opd7Qw%E@BsQowuz%rCE^3qiNhXoE8VMTc$ zajoK#tkG^W(54O?AF$`ytPOg;+fhnj|@Zo^C9= z&$7*?1uGRXzVY3Yx>(0;a%Aq>G`J$P{QKlUMh>FagGY-9w|_0l+6|RM`Z<9A1YV9Df$OhQOVwf=a?QkkpAkxjGX>6CdOa(g2ER+PuBN zkOE+VI=)#P_dGI!Ec3NyOlQ_5(-MShLPCWjO-cHtpAGL^fm7OfAr3aw%1x`Dpck&N zZ8@i(y;4v9x-m4P({7K{bb}EV$D+o8BwI>i!(i>IHT!n;x@8(?T74s6C(5;vm~Ihf zqP^wGB%%{Ar=y$qYlJxt0frV6(Bh-z{tkhp<`2{#5 zjZ|cNFI~NlD7OaFMwBwFHK?!&@`x0jAdLEuJ6a`OFtzt zyyym$l^tHiAHDe|hFcpwXlS$?v-TNU^89Zt=p6i?-~Yf0hXS6g+KT58#@ygOQ@LmY zK@v+P#ER0VE=4_|gJ?uhJ&=n?Y%+zMGOHVoO%QO9uR$4buEhHE3Rv=v`Av-1cRy8Y zx#J_c{i7mgE;eZ%DDg&mY(h0k=MvRW>ypf7{5|nTl`y`?0;pAZ7hOthoq!KvKAam1 z(rG+Cf3?k5BVB#|IdD23Ik&{n0pa~d>ly4?`}^En_M|YaZD@Lgul$t?a!ccV=mdDz zo0oudWAI0yAX|CyM*C&t7Bi|iGHHy2j2SzPTg&wc8B;vdL6JLoTCv#76NqD^0G%Se9n1>xB&s6oMc$9qI(pr2}65y7F{#*Wr2T9e5?rXSdnm3;Pj$3Z11-W z6>wU+M3kvHWC;d+kCV0(yGf1F1m>LEDK(v%rvnFwI4asK)pELuHgmm^j}@N;sAbZ) z7`6wrMkCe@=0;GhQfBQWORIm{( zKeN`dy4h=ZGBRu{x~$x;cysRk0wZKw*5w%%ZeQhDgWnXTVYXgLpB{XVgG9My#^sIm zebD*4g#;3D%Ur7@C`qFG8TL^=@eCFXK1R|nxQ-k1w=#cN7aR~Wr&)>?;VNtY8RG#O z@BsoHP6}?7)!@KvqfH=_uf>J80M}9t3c<2npa-Aocu9iFzkpW443pJhl&ZQDb?9N4 z@=|f_GmfVUgwKx~ z{rIh?ijO#7ZH%)E(!=5MCsqLPyDC1N>Az?=fgwQSPq^o@XS7|qa2s*nG)XoMiProy_NfYdqvoh3tzyMYDIxndJeP4WR#2k!09YN-5^L$Y@wf!i6N|zUApmPUD zN3Jj38j0n%Bavb{^qmp#)0C6YAhZ%S{gb0iSXq(VW2`5l#*;qg-`x1%s{SIuTYew_ zMILDxn?*Eu)AFM?h(AsMJE^X}c6DG})X&&Lg7l|{8Oj(IEwIe4X4~_zkm#4JcI(8} z%1Nt$-&lm0Ja|pXd3k>L(BULxT2JX%G|6_=Z}62Y+;1mK=p;6;9M8Sg?=u2FFlnu~ zY;%&A1b#(QQMi>*xLm#zC*#M_pFxHruAVmt+h4H3c}EN#RDYk-%4S5y%xBrK@# zzld@o7r%z0Csy6t>`3 zPxJ%uuHC7b=!v;iO6-H;=?$v|^cG(58wd&s8`aCc1<65CQqg%{=lkp7_lunYs)Hw2 z86Yqk`i#0*%kxfGz10xjl3l-x%T>eTl=auoUe?UZPo|Ku-h(*nmy}nQyoh&cNewdA z6k*cCEX+YTG?-#|MK$-&Z__Zhxj^?UJ<;U)NFbDRRzUXLNG~j)#sySKDTJ%5p=-~) zVBLFT7E~)V4Q%aVXf7|Bg9SMQ`vtGfCZOQ;cs4om*8D4u_j-t?o1uWtL!}sd&-6|APzllRk zbra*Y$a&EK3)hoaQ1C2KJh7?ZTpQ9V+kB&S!6h`X8a~SR&;ag*}vgukh0bb-b1uMjF*w~FX zFM;C;=#yWW+wNU8lVro&+V6sEKR+*c7a)>)cnIWH*plu7d+DqVupI5hRk{7E%VSOh zmGYsuC032R9}nq>0W#2XPd5QY5xD>rSKt~*)7JlyGt5KTy2M5ob0na64;3t&$1Awi z40rk%o~icb13cvqC~sq9Xor)-M5ZuZdoOaxCM`BogMrnYOgfXxN^APK7s<^psSJs> zVRjEjs?ky(y~WEOKDPe+;hN2?++p}M14ZEDdrK;2RiU+vL^N;9%Gl5L8_V+#gi95P(+IEV@H#qH1!r9dP+d+TR1!SwtE$wZq)jR4EWWNzvg)NGj-Ygebi%>SN>cek!|aw3mj zVBE>-4jSEO==NO97?@@qYjNLMNH^|F7SFyx6cB~yfL-6D^|UfGK?ZT?~s*6YKbW{VV13g zkF=c)`+XC$ohp@l^u)o3!4yK6FWR;t@_R-rS_`*5zF%Z8cwj25Hft=<7m!R$sQI~J zMWBfUNPiE8JdrT_r0C~FD2pmpc4sJI5t8kmDeKT$c(N~=pNml}>NHO~938?M#l?}} zC(pOv<$g)MJU-v_YMA0b??~_LT?hoXy_;GiNv6|WC>a3P4zkFACyEG^GsC494qE zI_wr^ejy-g_6mJxB`X2P)+bTEDe^rwe>Mg_^WiH8QxgUqC7f~i zl$%IcO;*vY^z3jc{;6Cjar$GC`b9ec#ZUCT<8!jCb_GeWv?kF@5A!?}n_{kU+=KoE%C_5B}wuA^cbhI$P8iRN@9EK_k>9r=BC_DML^KK`RfHXU>^AO zdUwk$I)%+ECzSZQ{Rf1x16ZH7d3Ep&0v9c*-)!E}V1Pb{sN$%8e1h@SrFBWt=l(_0 zvrf_M2908$CdD-JUyv1Aa~S7$VZ*%K>=Xid!@@DeS7VorC72O>5gaG}2$%l{o_%=O zou=GB0qmA%>Ouceh(U4sn@z5&GqTedC)(Kyr$zFnIpm6`jp$7$0AlS<@q%q8N=mC2 z53Ld2rS4vO^|^ctVb-7y4c%n~dbr5H-JP=feVH4NEuA_y6`_NnZMC82-YPh37cTR{=p+F+>F;PYL%EpLv$IX5_I_A0Qs2e z(N?v-ivR9~qt;&Zy6xJT8$Z9+$PRzSQ(ezft@ugW zO~rZ01Ddsp+{jHR49P=5$;$7&IrE}twk4B!opO^p-5_0534*l&+U7{sIx{qu1dSQ_ z9`Kh*e|C%*j@LN&zXfryo$0EU`3 zv6A~wzPQyR3a*j?1jn~0n{#MdnmKd=hQcrE zh(iz8z4QZ!GGEkNUFYoo5rqRbyPSp_(T$>w?DxPDtf}BTUW?j_;>%AGsrE4wo+vVk zptsZ{(+j^jG@_KH;(674hOD)(jaBD=O7OLs2dwT8r#4m1d`%(hWa>Q8(Kpp+2 z$T!uoK8D#W%m#j-o#*P+0mA1a!xGBBry6^2b+c@?a)POP zNK=A?_W=%J1l0T9)q>Dy-iqD56`PhcvN#V6T~t%>5>N#}er$(>6URu4*2SxgY;13e z_NysN#_$qJpXcthHh6J{xqmf!6!_J19ykQ#0-5j(P0CmTPNRM$Va6vXV&VdUtl5gJ zVwGW-2a`p0k$QsJ$Dn1h<90mF$}i_R!I9J6Ubh}SkP)9-_*|m6#Yeb(j|sw?7k4Od z`SbVmyzZ)MQGb2@?xtS7RbB$CRtwKHepvXuzHEs6g8|=e#_ft=8{gPqYk2yi6wu3G ztS>4ba3xui5mT$T;)5JH>Rr2ppgU?KNNo&E@oNkNqQ{V`On1^j)eCyA=JTC*x$_nC zF0Ou@)gxCbRgZo;3ntY~CmUGRhpO3^CR#>|>Qyv<8(n)_&aBgZAHa!iD^LwlD$ zlA4HkG9C>tVizXT7W~2qboKPOx7mC1l`DZ?M}NgyW0HFs4Clg>EjEaD5j6=aF%(*7}67dz%W8d+#RK$BoO z4|MoHxI-Dfyuoiry4<(xu=d6@F7Uei)#bM*yr`f z_V9>>-ab8Pma*L0yI(coq0X`nL?aXMhZL1srsaVHV@3J@lelvY%pr?VBV+B4q8U}F zJ#UdHqCf}9zf|yYOK zLh@q+Z$J`k8|Oxx7?E7j#oc30AHrbK49vCO)kA`yXOp-X?&ot{@!325l}JApJo0)R>&gUx-um$Jcy9xhd5p2K|^ zc3|u*j~>fOm;tNlGp0*LZuWto9V#^q#&<_qYqv4=f6;bj^kfnQ@%bQ_X{(x;NEJg? zvDmfi+`YsCc9I%@MlnFFAJ5chRKqs*rY6s}0_RUf$ZKL}#wA4~KuHC_hMAbKd+}zY zQKSkq2es|t-mTN4EF&-egrMdQZ+#|;;;LLxjSv!J(IucH9On0Z_8pm#A=?-A8?SvJ z4BI`zyMEbp@B0X@uZzsZdzGNLblJqThG59~BKodIvd+KpG)n$?QGdg(fI-~3Opjh%xyNH1 zr$3z(1k!o%mt?lA-+4GU_B~Y5S>Wj{+h7YLsZ2z=*y5-h9HJg0Oev z$nNZC=FNIeS|@bDoHj?ko=E0+>+9a+fQl-4(gmU?YLKzi3=52ORJon1ibh6O3Ep`N z473qGs(@m$>TudDt)RhJGt6c|X@y(|u6Sr}oZ52EYkUsKQ{Usi5-ErN_+VTvNNG}E z4nn_|ZP{|YX*III;NuoS0!03Si@JR8R#|byrTz`fz*PK~@G`Y@Q^!WH(&kMT%sQ*0q^qHuUfMja$Xx0d&r~9p6t^)K~d}B+gWwBXcYZ)AWR_uKb&uE5Xv8a z2{>(6q}Ks_1{^$-6oUINnUyi_S08zBrN0l0_X7^qo|2jLRMV7+V|*BZyb?vct!084 z4@+M3J>qoQt`HU1dNh=tm(5A+mqIJ*Sr!)qCKjlSx&tToh;O`t40W zNO54tY!P!cvJfBQ_MF)z7{uB;bxfUgT_I|DN+R07;K&fd-no&OF1kVrl3a` zwsX_1#~oXnCwRwF*z)4G1D>XS_nt)cZeun4_=W8N!9_j)NJ@Y0(k!j0)jEtGc9p|f z+P8|N@jorb2DSk^C#kRdzfW~qP}CGor&pR=BJ+mT0`{l8c`s#*?fj#{pd|%0tlA^o z`91XjZJD#p@sPS^5-+9BqyPe2GCbDcSEvX@(9WGsx9<*s?MmO3LUd~5|BPcHv~@mq zg9;JYMf*wb*)xx@yOHqjo!EQzSYM$Gf8`PCE8M;u)r+6}@g*xCLY<3Vhc#C&T9R(SU?R?5u zh$=JfYJoz$!XLmy?_q2z>{kFbi+JC_nxlP@V|k1{ul0Chm8(6RIE%)jU%-DOt+ZXX zhIX%*qmwS|BStOBk$aze)&1NKsl_Yr77(-9r~1CT068GTtXth%7EdU7mzj9V7Md1+ z@VUB~siR29387DjW()Y7w|JnG8<`@A`SzZj9@;p4vWkCf4(R2$s-o9XQo9UU5T+GQ zsWKe9u28c=}1 zG^FDu-KrRTo;Q@FianQE1Fb<2#3*PdEChwSXeJwTCcL40jyT1HlG}o4=Hu#*FJpQ` z4U1h_H*Re3I-*QvYhz&@&M5fV2`&v00aaPmKCExDYG-?d0`)e^X=J&w z!NUX!uqys{nTzI37EW}~6Dq~Ad*tHWB|cw+0R`kL){@eFb*T_}#=tXvTJ{62e{n>u zBcm|#_Dg+$wD4qh_8R&Sv4$4isr|8Ey!r(q?y}La4u;SOt?_U1q=l6}&!yeJ3p~3uF?bACv5kiS6w0 zFVfe#4MJRqk+llN!Ty6s=9j;c#kko%Ek|iT;mnr|Rb%6tv#iZ-Uh{UTH54Q3 z=}pyE0DY|kP#7-fz+C4HeAi-CP&2x6S%i^JdqDRuAEu?mrD4veYq;On8s?wHn(Ut~ zSOf3$A1&tiyr&WaT~p9p<~TyJUKRwX5k`^77E%!2cS>n19C|j~+YmDFUX3wlMPJ14 z$HVsdZtY@`qsf=cCpP*~f~QV9dOPR_#<7ahmviaCA!%P=$AQ$j2dU)!h#%G5>Vx7= z|IFWPc+Y=%7=U}F78#P8<`q}8rckvO`<|k%k~S~? zHtZhF?H;!?BNtLwIPkZ~5jPN%!UpyVVX!~MdRdxQYI4c3p=JRaP3%|{n1VL2gKn>~ zKB?c~qqZ)5*8uDpjlUw%9kbta&OZ;#-Sj;^i4&UJKK$%#$ouF`>r$9mOW5t!@cgA8 zy5$ED2^TDPOZP`1Zelsl?^w`3bnKM*L748xFCr|PB&9-@%2j zi{Js3lg)_|B>%lhx|$v6&yR60Q*ZMJKW(-@Ue5g(s%fc&D{d2M5880lBQKGahUj?P z@Q?3PDl}@YQ-S!#tY+#XTmm94X%9~A6QA1v`?m}Prj8+44@uXn(S5=>FKDLTxu$mP zCP2wD%v>NaYQ=E(yU>M83~4ld1}jvB6hMVMZ`!o}@3zIU@O-=Z-^cYIBPE4nX2>2p z`zuzV{<|9+8wKEB>J!){o5B?h;Wy+tJ1^}AZ<_=3L>X%#fEdjX7SXA~>kO(WIQo`2 zZvK%s{qbJ#2}yT>d)N|CQjz{uFw*NdLzn$&xEa~+(V$Yim$id?5cW@}9O0|PKjS}d zUH1Sl>jPXMAgcyWoki8MV4Z9flo1#<8O8uVp}~6h3wNGk0=c6>RGm?Zh^mMO@EdX zEpz-Xko!a7nH(!XQNd>J41)!Jr8|np)wNOvoD#%0!)0Be^cW5-^CqfwyPyz9d&U4l z%dzgYi1kGezS5qSsRmz9AD_a}#jIMxjhi!`8SciHFL&?;iO-^SOnOV99~dC0@oq<-Zv5+~_xl*~iRjL5m;+KKn*^(;2HH;F za-ZvVTTT-%hBZY9^h@|@zy^Y1%aHT^ZcWSobHc%-^-!uyD21C2Gr<&{L_hmQdsF~MdqjwR*B*TMw-+x-2a33v1&W_6 zwHDKgP++tcI7~>~Pz_wJKUwMZvCGz~{d@LZVG4Gj*|OP|Ff}6sJ89@Nrb4YpR=|gx zl}Xu^AA-fUd%waT&auuiThVnVW6u8maLvf)+Uj7GH=w*GdWI5AmD_X!G$2$? z_8hp9f+`D*osAegTuGK?md@GwzCSi1d{<*sDIogJhhcQ2*Qi7{(oBto?NxG?zrs)a zY)L%088o@I=d_>cM>L@YA%En(@@<`9_y=4YMR>$VW6L`v-PZM`d3kO?r-QE~|6uL* zPD3>T2VmUF5p@)aPMyuwrcHvCgsB@WB`EHq|A4?m&jt>nS9O?kPY$M`#yrw|Li~~H zMy>iR)H{7lJmFTU(6!Q0uL51}%f#mqmfKF5aQYrcNWbwv>B|@Og%nVgg=RH%RZ~G- z)v}Re>g-ITaP_3^CW~y$q{=$97xOeyHk;VP=pV_ z26K!?J$1fK&rn9D9l{o?iw~ube;XW$rj4aQ{tC}b<9*Lz`3BRcU43CSYKI!g%0%kt z9mG1Ts27lTPju9K2Y%@dW~$n`F9F$LGu<#=-LE`l!%S7G9kTcg(E2OR&SVg$NY$l$ z-oI(%1f%JuseQZBL(_Ybft}~78XvJq4rR{v zZNTz(%P&wSQ1hE>lxoVMHGfZ_dshyKRNgdGw$+<4|<%Ry)N51WZI; zIb<;B8ht~2r1aNJpF}`D*!B6f%Ls`ifM$n{dQ3Yd3egUiH5@AxHqr>-^Le!bCxTfO z!88IVIXimj>KWF>ZkskE{|N+PPx^HBPXAEWQQ{H|F*z#{gUjx;q*f{p{GJw@#-p!? zD5bG>_JA?EDTS>I1QH8dAzqjc6w^7YVNR@%B$Xd` z=&?*7XLqLJ9)}r{mlGW-h<86H@50JOy=AXLHHjn>Oa(U4U$TWrdhLO8?LFkPG605C ztm_^|U>`w{2mT$^KNdEAet9*!RixjpIMNu?+lVe)8m+QxS%q_SCNcKy69fG-K>PCG z@%mJd%eVimt>zbp-FpMUK;7u&%xEFLx8>4 z=Jyc3UUe{ebH;4XyTsi##0LRVAq8U|~&{tl!2_7YbZ7qCa?Q$niQHi4{Rp#b+(Qt9CAF;~{M58WBS zhd*i1QyLWrPMb}>YT-_--?Q18NT=68vRm}408x~f*5uK3-rCgehXDOUnT^<=#lEJ5 zA>wa4Sa8=>hVu}GjE@ew zj#T9-ln(Y7GmMqJi(~u``AIu|&}d%+;KpU+?Ag~woIT>5E~|~Dv{lLJV}}mx0y6K0 z&yIF?qLf5_pk!VwCb@~J{XqEyKxuS-J$vdX1Dx=JV)4toTiu_J=4`cQiZqriD#G*3 zwfbAaaHn_Rh{(wL$Plds$yndtiuz(};RQ8O$u%q8lmU67NfWyA?d zfo}_r2giRh^^D#e0(qFVlT6h(SC?VbP_T>;vQ_Yg)9(bVCcjoj6p=z8@6i)WOVN}? z;)Aw!Kf=K8!Xn#VhBAF--EZ-0Z~ipt*lC)olk^P3sh)`rD*k$2&>T3<`8?%T6P2}; zTd3|NUxERRYJ}}>>-F;gW}IqhwqCTBbUUC~XXu$^d8&;%{_uJcRyrAQT4iHtDF)XvEzw;#DRs4ah~>k)k9 zISR_moO+Pd$68)YUd#gK25E}`qDrZ6GTT)L?V&tMgy#`p?RB#!L zBzZTc({L5uv-CI0Yb$37s(&sq1}|-0wXR{dbxQQWK|UE36k#9dxR1=>-VOQ9;V zzMP6?nTfo1r;z1!a`YAscDMN^j2}W=@=I{L)IK#OTo6%hom&jec?eEKhFfe$^c6$t z;T6^Y0*^p&zs^3%rAIZtkUtf)@}^sNDrq44j!B}d7~UK)jy}LTqNb(vnBdGOjfmnshmQN>=vp<60;kaw8h+&e|1}~F1J9MMw*dL(DZAJ*N?4(-OV0q`5a8Akxg->A5bstvL zT-M$xXq=_;94GRl9iz&3aX=T@5?}0farW)J;8@k=5lh%R{stV>MPYm~z=)UHI&+Hy+O4=PF;8jb0zMiIkI6WOaJ7nMAQ3 zEjK)He2UZrbaoOA}Q$cc)1e(A`dW4_rV)dnIXOVws6Q4fuD%Ql*XFfWf1uRJOlYdYdL4SKqvPR zvrma0kId=Z;V!5T7Rn^_P}^V``*hok$Sbn@DR6RnU8^*+7UC)+NKRSEKEkVI_B6Jz z*hIV=bEseIj>| z2#@rj4%=aF=S8=)ssABH828N;_4uoSvfG|xUo&fO?zJwrXM&t#l4r!{ey095&SF&z zkNSY3ix7UL#s(poVK+W{?((~JUGTeeWJehI{!eXWkK$s31}odAnMT!N^z~j}^~Stx zu@52w3E#2Sj!4!6f>?mv_;uO$+9f3+r!<9$4RiJBE74-J15D7Dm3mc@3af?}7AQqVt=fLm<4`O?{}gd34{Zzi&pMhGK~ zl=c^Lo>@Sw2uL4D>zd&x3-Nqae-aB4&?D{$pZItCz}XIUjZNd@m=7aBaX#->PvqY1 zhhZFAO-*>II;?vUAP+Bbc(fM}&SB2G=KF@)_s`>Ba*v5Y4u!lwD*G;Du}Sj(T-lTq z00>kg*K)0+$T*q3-laEOhU!a)3G@B{YBaK`U$NQ?^PgH?IjGVqsrkBL&@w z8CuF-`cAMj+wgYVp(?f>%aUIkgy7I;AVu(2RMK1r5R5*a^=Myy9Bag%+y4Hqv8nO* zC&?Ghc!k>b0TX$4?__64sDyYJmz?p-LvpUi!CD2zOtYQG?J9<-1jBtAJQWW#Zk$iA z7^E0ixSR7g^G#uSEqZD+`-bJhgqZx&SMN+Kd+O6VO17dSK31IN-<2)f!fbya}g zD&+6BgGv^0b0mriH3l%&l)`&%a4J;RG~?y1AZIWV5BTC?+;-)aJ<<$(j)fPzwYl1q zvj`Di>vbsNvSyR!Rw*|%cIPjTmO5B6j01~Czj-eoiZ67b%YQhLf+(2ZQ*wM{N0s0( zqV`^C8q)wqhMQHOYxtZtsYdIeJXl|(!Y0R~LAxv%5cc67j-F;+^SelENFKw}pH$B~ zw;8WD<9npM;ig(Nx7>nRIu#Mz#V-twHAP}GV&cg20e(iwI;vrnT>MCJN%>%IsN>E@ zDM#!Ni{~^jUUhh0K3njU+4HRtBT;bY4KVk52W6+A5Cy-V3()w%*qfNY@l2JQNM{3~ z0+2D-bxRgj+n`^+<#ec>6mvDDX@Iy!%@+0E%_&(`B4C0%@v>V_9IPeRc|djK^&{Cm z716qUNOlVA=ga}F#baYpW=%3?yM_YOz-jh^n@uqB=&!<{LVl8C(|2Kwt~6~}^+`wa{r&RxTxssYKy zfzceBDUIl(#o+iCBmjvfY%$a)O4Pnbqi7jR=2LFRk$H42ynARBNZAC27!Vtq@z+6> zhov5ahgp_a$9#Y1%p|aK1t1}5#_HKL3MK`=Vw0A1HKr6O)>;1n&{JhTRUpf$a`dDl zl3Y;V(^DvlL1=N7l=%j=9sufdI@@$=UWd|9raWC|i^?IF}GE_5@UqFvm8L z0oL9=Wg>`XWzc@I0iYp<5)nh?${9G>+-jpb&hy*_HF(}2{6luLWaQsTd#7GV6mj;Q zPwa4M*wJ;|Lv*=(pofO+M8gA*-NGlTLi~;ych&cZ|5D`hY0+46%g=`;g9m@lW>BLY z7`_gR`=AA+`p+#+3mXaL&I-zC+E9bO#TuUCehq_4_vKXX&3iiX%hm(HiEZ)Kk-L1y zM^0CxaK7Ec#T&KajU2Me+6 z+8={%URVD?IAK{oq^#VSNq}aSvz5eFB}{~*x|p&I`XwfC3@cX(+}o+H?X_9A_wdOJ z9EH;=5vtfh%sKH-x-NAEH}o(2otGx&!@E7NjKhR_DPkR`#8=WuTRn_NeNglxSFzUu zef{H;I*RQb3wBn=+52*U&C%+IaN#qfx&HqIz)Q4ch;OL@Qw?4gB)?Oqsd-^W&5QR# zci#_WeMwfN7WXh}O2fKxw){qdpvwG*e9vJ|gSnYG!Fh&K)Nj$yK61%#M?z*YDH}m> z>lQgUmSLBUV41(KFO>}InJxKO8_#>KU;Ck6I?q;`!i@&0^12E@9m7k?E5zIQMEZ@C zPX7YvHa2b;$eXct$_*ZNuat}B+lraq&nJV(FQejbiHC)vPoxqM@6yz)?f9v8w%0wJS+68}R1Gi;dAQPA}Dn3H$^HiFx zl|5_~t`29~g`7zni-?sGGI9WkP1?5)hYf1qQe4b_oX7RQ{!?W6S*WPc$3|^7p=0Rl zP;CK&u2JukT%Hk7H&l{5I5oX zF5YWK@T|gWuR>~vD^IAj%$HBB@SqB0H0_KaCi?DNeNYn2r`2wO*9qjc1L*8&@pl8VRCd=|Z%T(1g|f&4u{AwSc=#}x>zcFT-C&G6_d^lV(jH|^qFUp>vy%} z$5Fo;@JME>i)Q zR`rhv-M)Sw{IJXXJw#QyWobD=$R-Hz)EpsX|6*mkwfV9D ziC|Te1721(c^1nqLo|dJb&|nXm!ui#VYZnmdB-C>Dd-+qA$)tQC@p}Wkb}bBU@3ex z_#D%@xFm1?H};x+Av_2~zACm+v-KnUOFNKMDeC_Es<|AHVou{7sXQ_<1n4~9MA+Y0 zcvP2L_g&@;PLk9l+}Kr{PeBksiuRBMHk$tLwNy4IqCCOdPa+E6tw_EVC+8pY{4V?L zvAgZE|3d8k8Z~{r9ba!&7u&TP_SxUJS^MqTU*Vu%w(9+~=kTYmw({otZ-3!tZ`)`7 z+t>JNwf6L5`+D{LyV>7u#eKW+-)~LV+obg(V6?#BKWbo#ZwPpfOchJpVD=lm-V;aqd0@ z42oL*JSfBj7uR>Q^m<`)O;u4|z@6s%Gt~7(xnC`LjBwQqsvHc0|i#grz<} zG}21ssdX4vQTNjtMJChbsVC<8%wrp1w(sPPh>l{Mc1BfoSxU&Dzw=r`uTT;DUY3YU zuxk~O4l?s3B(U4zw>w=_=TW=gidS7OBt&{SahZjMk2D~_^JMP*CDsaT(MpP=N^Xh6 zLKQ~|Kkmr-Jt0Kz_)Zl2A;E1DM*@u}c!~b~a_|%m(s?>&ytmLO65pSTQTaGaJFgQ> z~J5j!J}EmKNj8IaYTt9lnD)$Mpl|%lGJc`Im1FF3`$e& zU{ZmUB=kZWZw_EN8>fPq`=|A$idG`XqaEa!m_*S~{4*OCBZDn^SGwzr`YZh#fA(;_ zaLvV=2<#QA9*{5+oWm0gEo3tk04R=#wKKI*$-(QCKJs9R&jgP=^uhE;!gKNKjQZL%*RLEjjk40T zxg8Pp-WG16_&YX)?ynO7@5_M+)}-9qm3r`c!r$;CEG*s}_x584RWZ=0>(`LXmg1SA zp~fGddmVY5wi?l>9wplxg?r2_&STPqz!NQJf@fYgUDh~Uwp|xl6-cOmdwPh=(i$I= z(L62teNubRdCw}Ec#3)u60`8@fXMyURaO4*k};(TWT<&pUd`lIiJe%OlktyOcniwI zbPLGF>Ol9Z$YsJm~W%-J~kVt)+*F%fy~`{S&Fx|9|{2?oqDsB6Isw*7NF8TL=jw zg!^6)ke(|e&mf^5pyY&8F7@MH(mJegl~_=vAt~ZotvAli-SzsdC%pJ}1qLqg+Bne+Koi4_INsFL;n8q$>)V6``b}UY=(F1d$ajG zTg4E@re1Ba_WPCkH{Q=zdVbxjT~OX2P$dg!F?iRI3p)d1(uB25WjKv-MW)?9X=DaJ z#HCtGXGwhfDp_|CZw&jA&}#7oXqP} z3Fo$4Uuu>B+}F%=`h<-=2RquBi<=P&fx_LUW^#_`5Vuy7HpKp1vvR>i$$D|1?$<1q z$mOP2rKG|E&r%`2cll7Lj|+4$n%YqmuxNbZ#o2j#HnGvY21z2x47h=8G%K}ROeNOO zi>T&&fj$gmP})ZpbSODcPjz+yB=zAtR!*hwU;=`00yW?iyPlFD!-Od)O#>?#Cg=+* z;WoAH1F#9mQj(3gQvD*;e!L+t4t@Eb8)O|ZGete)?IFGo^3K<0Hd)CwO5BiOdtkDZkPPP@bg z=Jel0@cZv3pfh_S>Rtv(SsM9!ZtX$og%92s@z*iE-@0~9*p^dNj_5y z__>EMp;)z&t&p`;cSB%M7gxa1S>o3ZEkqeX%>8pDicH$yA_O~YO3O*4xoC!W>BRBM zE7XVS#O~sM&xwRQN}6 ztEomGw!S^Q&6D5@nrp2Ipal9g9+reKZ_thWKZ{QvS`0f%_%2U)hR6LrB2GnpS5~qi zToHGv3Rxiq&CgveuejO5{Q)w&)xS#*GBjA5)C{9Pi0O~mK7OO@S7&PukUUkQJz2}r zk_l4PEiAm1U@3wIF9F#sj?0jwXElfYnTTAYKkC2g>sQ-FIl>;zVaIwX@QX_SH;=)g z@HN;5Mnp3Byq35Lul4e0;?CMM)SuOo!-Z>PP9>K3* zGg}8-)R@$eF?umn?}7*1ubjjwfXAxnT8iRMqt9p)1x4D3_8ka91KdGleEa;KOvO6qAA(;y01^$ z6j5NCWxaGBzj4wNb`YqB(1n5RoSlJjFj*w~`It(78fCRZwoeTwSP`WOJ3O>Ub=m?r z^RuvNQx*4BAy`1_VV5ug{?DvQ{;6Q_es{9DVZ~u4sFav`p&U+D*lyGor6DH=sYvT{ zg1nC&{uaVuZ0LoNq3-IF&97D&T<^`t@%%d2mehr4;+l@2rs%g|^e&{)BB~9QLo4D2 zrF;N)V~>zxGrB^uS|nwoL|(IwFbDfT-|l@ zHGfq1TZ@wa4xc4RKj+9+^hJXMQsOv54J12)KUTGW&RBI^Zddna?F(s*^gAPIzRD)M zsbDRfU8`Y?woHcx6GuA98o;f$4sXZlOebXO2&t#^$mi6~bkk{-0NH1`iWng`7K}hO z@Q9Fj&}=xsm)d$Wa$9Jp9WF?05q{x<5i_%O?ihTu7iCQW9o$weK@-h<$RAnq+sNen-WLkQK`&Ztu^OD&~)HukTg z+b87RIwW2QDb|4&`lhbfo9wD##T=>Bz3cqk4f)v$$ZrxQ6D3b&4eQ0mNvxyVc+yzdh?}VR@sD{G?{dPpBvGO z3S9-}O?s6&vE5M}LN>)fn%2xO{Gq7)+WT!)8kPpiaNFj3bsx?JS!QC@H!3~6Y;y4| z&2$bbwX3DB^SH{uvqDXr50RMZTO5nYkgEQ&5ktv!dxckHastQ8R_Jo^d$J$d9^5PY z22RWC3BE?c6jc9TCtWpP^S-+}-u+RubDtBh6$7;Xw0Sfj3S-~p-r@1E`bmWz<8@Vy zqifIOE5FkDjLn1HBz0Q@jpu#ZWN0p05X{hoJa#CRExqoNO51xL^xEPJ3mJAP0KMoy zNnB-C0*eUrA)}{#^jP`@0>??Vf-K+h#G#$p**hZtBPE&0MM&`9vnP{Vs ze1vvj?J87rTlhFE`)x!}0$h1aLH3?jjSQ*|Wjq{^vkftuu-A|*=N;|oM+oFlS8sIB>=mCa==K-B z)e`F_VQ?~1b20n=`Lw8nh$0P9FvZp8t9tnBI`oy^9=y%0X#CgdYf?;cZgf z9fI*x73;RilXa<8(~)A6V|^exhLOT_bY#4%QVc>~mT*suszqsFWq$ub0+K#rl$1Jwllntf`(037VsB(LjL(@$^rMhKv03}Km zO3JP5L}f$`C2Kjtp^_hcW3&2(j4_PfTf*Lom1qo_V+Zivx3=W)roR9c^?smXlPU2=@_J z$?dE*+3+!Yz>&N!inFoEeqMj}%(f!x4n%Dfu*x9IDxo_`MW#E!?wGz$4FklA(2+TL z3Fv;iznTmc{}Z(jJ?{TT;WQsh`NY%NsKChG>U{4*qGK}m|1p3XFqSK|-|RluA`L{P zwS3UAf!U*Zp?SAFTHqNi#s2{&Cfj-TPj2d!-$KN_W2_K}9;Nk`?ypRlPO1UOOu-GL z-E5RKnYkO{jomd*%z0qnJC;pbiGolx!{L!s3(CVPPNq0uTX+cntgdXFO2C)#EwLvxiAw_R4IQ3a9A z=Rtf($rTzgl-%hEu|(mZfZ9aXMU)gz3nZ{1L(cQW#eEE{s6gK_0RCvnEb= z$R!phs0VBB2}Qc^)X!#tdiK9Wn}vJj7pKu0phSU9cBWViSmL&lgWnup-mtv$e_=)F zNz28AG0?Le={I;&$ZC32_%2W~5Mh?b&^0eHSUY4VyZx3F9X$VSk7fp9|5eF(#ksWw zFdeJsM51#6(zE0J`c0-Z5C!z@v@E>Ak6CdE9UW|gWJdO&A06yE<%b@qiZGqWtwCBS z6<+TbKFL6B1ufB>IE#DyWuM1M$vX~*9hAd|6*InIGY! zrfrL72w00lIn-Bm5uNsQBC0w3VKm#^s%}Og^wiJ3&eNz9?7xHhKPJ~#sK3rSZtxys z@4!$YiB7;dL(xSVmX&ityzrZ*D}CO6VO6Hq zT`t9I(X{j^DLI=lR^;c^>cV<&#_YJzqlnW?p zs$B6PE5$2BR5}kZTwF|u2zY8OK9>q4IEeN2gGqPsK?X#r`}eSWuuLNUrHX(4FBPRc zVF{plFIDN*ZIuB%THl-)M?&;*VsqL+nh*S-@hRaS#6N^^;88sFi^!n*>IrqM!6S1g ztHSP^k72K%xm8H$OTZeV!xBbke-7IIT{jmWC;Oh|d+IpPed63|q~>{u_;yBO#tQRwXOiQ5y=s#vYciZ#=i{{ah@nAF?Ki{pAG z{q~ADha{q3KA@j)4BOia^$-~g^U6oe-QjxnJDbx-Z%+;Zn1IqpFOq!tDxLMmt=gf- zUIiFUgZz&NhJSElx%SXQ2~P{Fr&L?v0unQc&8840bBlJ>=q!24Act$>8q)&-z(TXB zK4pwBaVGLZ*~yneW{Y3Ng)|=H^vc>v7_f>&l6j&84b})RifClQVYk8%hQhhh%;k-R z9&)4wOcmhD+S26Y$6%aKXVmTC_)F6h!)Wi>;ANep^c(I~*}j-cF_nx(UJ4@LAd45+ zWz5qyAVK<4zz+@tVEiXPSTp|9w~DPxP%ayOi>P1B`nYks_(N446*uElGFZ^lR>%!@ zxhIR}%a2u7MSEmDl6houR_i1+_WX+%K~1$Wak2Fk1W|LsdDD)3;5ZVFBA|m2$p!y^ z_9Kfy#EXR=moJmBYYxXl`mi845Q^Y>?-3wFZ9YG`^Pu$zDsDq~#NdvcS3}9IrK>G4 zQ;3k5{hol+qKXtbl+PzJGy|PhZkh!utTH7_a0Xq9&3-LN)IO^=m^V{B%s*=7vQ7VP zwc1&DiO^QWNCpP&oROSmT#WLbMKwAa<`>+w*68*rTw)4Re3^qS`ylYsyPcu_S@8Py1Mc z4v+zc=LH!6A#_D$CLJjn=^P1w>>*>dWI!a zpNwjY+EUmJf7f6(Zt6Z6X8z|MsO*lFgb>c+TJYy2q$TaFcSzENy|6W=*M&OTc*?|j zIM!uD5Mm{iRbd&eE!bG0emQQ1)0e%DTtraYm_O~ly$aQLk`s;q89Yl*yj~d{I80z9 zE`|{uT<&@Dz9%IPY;U?iqee(3C$&i9WSw}TDv3$XeKWrfDGEnWLD*vM+)h5q@}g}6 zx3cSAFb1EA3PX^~W>V<+(<1PN*us2ni<(U=ce&g}hA@Lj7&BKFJGsYI6g2W`S7zS6 zllLYp09#kmwWYr#o2X*J9b^yocN*!xe6UX7~CKlM}9@N}m))CmQ^ zeM;dz*e<6yepB+RyIa zGNA8NTjVF>eD91m4Vrc4E511t^7Gq;8Z^Eghd&|xuMKca@b|5_t>># z*%`Ej3dMwa#&_`tf9PXmgUp4t59&3glamY6rcGzLtPi=|u<`A0#^fdsfteDatv!0AA@ob!`&3c851xFilqGyeo zbUyvciB|>lRt=*QmG_0|ZB5{y#?qUXG|0Fs2u`M{S zJ9n(5gnA3mW`$NtA(pey9FN6Z;KN)=r62w1=6eVTZBYLns$m9<$r4}mgf<%>bx;UY z8~A^iyJp%@p)BICuL~Y%@&uVNg63SZH8SWszXsIA9xcxuwE~z-1v7rtOI4;KkCgS@ z&_{tB{s4wqxLq;DDu3(WDK0wrNo&CnS?1D!6cO$2&U0WuP7Lpe@;O|$HW1#p`X!5u z$c_ZXl$5aIG~FT0FiKP?ig*C?sHQ@z!O^P zGG|Ou(Imy-cbUeNKIyS&?L~tyiRtHx?EeK!ESxq!ax+}um~E96bo650MybT$w30)< zi6yH>|f;E7kmTjKHKl{BzR)vh0O zyq3l3t_#76Tb*M5j4h1?7yb#%(4gCFauS z0@lak?6nZjw%+V>kMJgS`F)Z;@nv)NlP-8`Zb9ys2#X0L2!p7qqq z9e5&%`V4Q40Sp9Wp^Rjwg#;<^4UtxF?;^Xtdg_qUYker!8GqlOD&MWs1pqQP#i9+& zOblQqE3K|9#ka0D?~Z)UDx$JDK9n;(3Xg%i`l?)?l!2iy1J<6sifq5m(1pR1u1Cm^ zq`?7N6j)AIE;JWQ-B4Xu$;8)u#9$r684rB1M1%OTtG<=IUrhECs65082U7EGt6M_w zHpMY1!j$u)MudsOdFp2<6o9n?e5z-Ra%`E9@^@^P@95)w1)`f~M~iP(5N)?(+%%#aEEG0b09 zw4dm(tmWK(&cgHN@F3*@dTt~EC^sU@i+a0cRn-R%k``H-$gB!8Oc=VyFH&cIN8a1L ze-$>{8XUDr?>7Aq53|d!?MEym`Yl*Bv?Q*ule+FQlUl1dFyH*mIAg>^u_1IHwS;#j zv7w?)TpJu5&UZM9CrC6=BredwR&n|Tf)}qkM=eK=yvuWNJ7RH`#+s>-LZ4`@dz90@ z%VDoYzf^l7A{4ptOE&G-CnH_X=X*(Wio2~ZKwAh< z2c%dzB=E9l0xV&~C@6K-07ELqpG;(Bxe;52z%)`am(pa4PO&swPu?2h$GV+b;pIe4 zz+ExVqs%Ljq1Vh!$}a-8g=MhJbcXdd!yfNuN~M$JrG;Xd0V2`i=Lqsba7wbTO@`275 zJmY7)c$IarX7^^(JFg5BrsM{3TGpd^Jmmjlz`Sll(*%;IXa9V-C>i5?@*))*bJCS9 zE=|ZG;0#vI83Wk{Xb9clb=S< z+(g|_a0Zi0V5RN0hsH#AoejZ5ChavOyn&ns<~p6izMi-W&E;K^@*#kdf3VzsBGz53 z|9broxosW1wEO)>*j;U_@anRyB$7!al1U_zNhFdF;EJy=ss`nJ@S2Ud9f6}S^Js3d;2N|Lzs=gvn$bpM9?FI3uNiO zRmM$!mTvW;Kl0H5c*wAt0#C>t#Rdau$6MVEU>t32guUi2JwgW!)$&1zTxy_x+y|J2 zMl|c}uB#%+%sY`#XtSy6LQSL}Kdp0hr_kwS#yIiH!4??;F+k;{jcQ1sV`Vr9gP#i5 zZqbNr>aW8LaMKlsp1ck)kdw99htDujVgP)}iacuAaRJuX%Es4FhC}9H+mr~Up8i<< zN@v(-lN$sMRv8ZRd7$y^*q>ZV$oD(S(d{x98cU#->(H7 zdtTNH>*M)0&+Ju{@N^439J`qfOX1E(O8QKCpa1{>0003E(((iRa5YinbW;hCPGX)Z zC*e-(uADQBp)@XGWK_~G9YOZBqjaZzOb!B_14lMPSTS#0>`(}gidL>4|3&)61>Nt$ zxFV(8xey3G^243&)pz|%Mpy-Q8+W1e#+J3ejFf7Pd+;%#s#h<=da_jP{~@xj&Wh$_ z=G|q)8?tw2si(jl%yAnqWYyg_8k#d&ZAEt4e#CZfTc8Gl3Dy5gySKdFbnm7`u%D$h zA`LCRjIaF=^+@%paqgtVAitq8iL)jXo@G5hTS5M^!vne`8+nEnh$YH+M&M9Nz%K2Vd;pWO@`#Ki&F~O2e@!JzGtqSCmXlt0eEGy<|@^;`zwW z8;}PSJ_y`l4~gWYl1U_zNhFdPO{@^K7gAx~*O^fg6!EJiFxD!?@ z3R0NexMiIr`D0hN_8OmYPy~qe#ZI|cX zo<-t`Ov{YIhgv`ZH96PVgfpDgk2CUIV%fH}dijKYBTdYJn2c5CBTFnmeEDH4(HR5{ zPjFC%BG?)>vf&QbTgUq1s(S{BhN8hKV2Upq8UyU zP-}$QRIwR-5~^alabZILb{>F-!ct1DpWzus8tFIFaMP)DP4vE|FVC2zu_%SZ2PsS) z)%HDgHA=-*pTZzz<*m)?YK#4Shc&e(k`T2kG4CI6sFJ~w|4(z1h^OJLpR(g2S!Ef0bO<^6p}Qc>1nE0r7vJmhCyiu$ZeaSn9{593BhzyH5@qOL>{iEY~l~5_?xd`PwHjv+sFvr=PKHo zNt^!}%#4;9ANYMjx(lnX2y>n7TY?w3f3r~;9QfF_%try|utzgR{pk`jZ>r~J$Gg6& z{>Ay3mlF9~j1k}d2uZTqZ15-1ut0PK$s0Krw?(l*$2_?7y|2_;>9a2hb?zEh!Do`t& zEC6y1a+aV%lKbRsK!4NB0G9a@BcP^ zX1Z+%E>+@Y>i-o4M9+f$*qh# zTMT#j8pp@@KHbBtIR~oWbBQKRxqQS)u%mT8?pR=has+2zZZm&>GNx?jdyHsW^iu); z0JgR2LGw9S{6^1P%8J%6OCNgp28s%XTqv$cElfqwSRncB!-h{q=fr!~Fd!co^M1mQ&e9aod5ueFFpqcqhe~$tV*Ktlj8R&)b`jVmJ2Ou~W8K~ygMT{1$g%0FSODT@L;`iXR~HdV09$>yi|f-DtAPqpg1>2^S~fi>xVSCmd|wDgn*hX+ZDo%z}w-zSEaxIwx&lUk+WsScrk&j*!8M?s0 zhk7RIw{|HLgWNQ+(6@F7Q2W&EJLPMj3}YtF#B|q=_z(3>A4nza8oIKIH7Idk3I z5;gUFAQOMPB`{C+t$YQGiOpwS!3G&*p3;TY|1dmqL|CaVqhpZl*2VnLF_x)48F5gG zL$Sq^(h8f$gB9Rh1i_tf-2DGmZ-3|_m=g-;eUFSYXIK{tVOMMdjL)^qID$`ul1*t*>3A#RF zaXtCEnAr{(TNLOB&TJ!aKnn0KUr;VZt+nUK)59#HJA9S@2hKN0N^h;Llyj9Z26{7$z8u{~ES8XqrGcMFg_y_CPBN`PZX1n}p)nJ6`i zZPeYAkxGX6Z|o`}d-5{y;Qo7^gekJyRX52jYS1@89}4AMl^ibxO)C7Zr~_zrHZO?o z-y;YWvttu9$687rQ@3!NF<5blN!xOe9QFe;%OF+-&!^W@1~7LxR_@2FSBWcx#=$F3 zQv>d5=&i-=LO7zEXf$Y0KnKh-=H8MQd|6#AZoB@m#-{%#5aMX{Lmk?-&Wu_rKxI3$ zY~EEb`_gx7G5tWQqX>Wfob|R}kQa*z$su3~1#%Jc>7iAf%G*Z;X-6zwPylc} zM7w;I;DV?ny4&*n?T$@x53r5k*U}M_r_U^e`r^y;wW`!e()^0vc^m!Ymp^JCwQ_h& zrM9mr@|R{$1Q~+JX3~Dd7BS_7O*M5bRkZcKWS-9l_6E0`6hZn~QMQds)(LjICLzV;Nh+;lP?FEuF zPI9W9J3t#@2F$gE$gdKif-UNiFT%N3M$#?_n5ORnjRxUQIWqU$3-FmRkF(fmQ1lH$uW_(|;4a`T^UCo}F zrk~6>@0k(>P~K1kJCaAlb%x7ZwMh$;oq7vKlE3DaIjO6DfI0|cxxi$b=+N=ydXx^nZpYO!U3ppI zsnYNYH++ivOGf^@H!~n;Ew099h7$WcwiVAqV{8YqH+h)VX+@;x)V)iwoAu|q+ablE zjcWcvUbdZrDE?Mz!w5>CJY+kYt=VD9q8`=bGJr@}fc2Gj>&En`;D~AThvVjx`YBN> zf*=O5PowdXjPy|0pDk%q!TZ+Ep0>}Ds>3gA?{gO~^RcBSE6^C8Z{DVQ_qo_0bc*FU zL`N$d)1aJgBZP1-owzs%&##tj9?FdG@%`7aZVuT^w1yI!WI$5nVq5wjl5I{HM<*8o zPz1(x70G?~sJvDACQ)}&0${Hrh^8}vY^e!qppk8z99*goX|QI+i@G8KeqkZ-vwnKm z0Zt^b+m;ZsZWA1t(2Ls0Bqcz+YyB@paL#Q+d_x8i2LLZ{hwAf5rT#zEZV}4-gxrEi zxwb^Tl$SUQ5DgV0HM#@(3lamU=jHdm#Wd5=Sh%dWl!u8@JtHd4$}rPQ8qz9^f48v| zB+n;l*uNZ@f9~N6M*9B2*xRC>dHLa^-h4CtvVb3bsbS5q5DGoE!!R^SXjP3@7~f zTwcT+uxK`KFsPbQO_7$9B4siB$Rl``cF? zao!^~{f;@Yk+tMDbkA53|3(-r3B?Du&KijpYvFb?R`$nHp2~4N2bD(1Xo-r@S?)2n z4Fl-cw5p#7KeOq0Qz4+#?JRH>ElBPCa=!gTm-wFrT4rno;dqGZBBX*p{QYfcUc5E| zTX;buAJy~^KtWzwl}QO&7b`c?0CMB31O+>f3%WtPfGlar1{9$uNruGAjN>sCb+cf? zFH=Uyw#QXaoQ+F8+nE}RbgKsTPu47pf}~F-L}7st#evCcgoaWPu&M%3c0~|vIfdeS zvoom9)>WIJy>`sn!X!(mGp=vLZTjzU${tUbJK5@wo5`c059!Tg_K&FQ*n4<#T(i;~ z;89r@V*{X%(wi;agSJe%IX7}I3`N61*v}i%q9TCyLw>Q>Vby4K#H4Za$g2vDn#|Qp zk8(o=snlB}{|N!>Xk|O#?^x^-^^EU?)hoj2A2OzFz?coF%D-R4egZTtSM9k5o4{?_ zlN?-@e7}&aGx?TND3Jzit&!tvY`V}8YKisQqN3_GOh%IsI-9qB(}b{yum05%~X zB;F@SpYw83gZa%fRWSG1O#gA^x8mIRfWLxvVIYU6nH_B19+RB@^b=*UWa$ZV**2=z(-BfONf1%SxXje!GEo05|M`Upe_b!M& z{B`D3MgbH>*~18Tdw_Y`eQC(}>jnB8Y zW~&8yyk3S=X_sRIUVobX#CR|Y0Tl2HOhRCnvHiQUag;(b9u3vZeL34cO0cHcdyJ=q zqr?2CGJ{8j7Mmot6!Gh4fR;s0T+E@>F-Ss&C_{%~R#W+<;OFKHt;iPXJ}w2E+JmUn zh^;~apJF$Z*z8mv)H+Nr!ts8wD=7~_?S;cMl00H2F_XihmijCw-0Nz<$(s0aV4+H z*JvGmEc$^+cH8K@z$v_)#p>~0vAj9b=Sqm1*~HZAu^8p2V6G?@E|O6W(Is6H20a=U;e}V*toowr*eV4%Sq_)*{5jYkv(L$msG-^s~JsZ zxKi)ucV*b@w-`nek?ST^w0|?2Z{KR6@5~)+l#ybQKVVGk>#ATYnlZ50V5gZHm2@_&C(~Y&TvhHsYgQcN4@RYD2s4Af zSr|!ozTsR;fPfTHbvGEDEu08$Fw_l$Zr1>6{7D~Q3H#<$K3Cv$)9z*MlrYgR<+qv7wj!FDGi1hbz6&OBN_jHz=k~@dc~E{Z&t7rknfxh#>_?u(*4Dj&g1dBo zRxjR}cJy6MJ~M(b#Y1i9k!C|~DrNEd&({I?rbM>HHP}(q=nR`xmlhGp9(k9t%QU!! z)jouQ5|3qKgB(yq_f`U8+=DWR4ClnT2uvrZI6{{NSU!Alwc#100Wz_; z$8<&`$xLPb&1<*?d?cg@{kF#y(0cQWUQDm*yb>9B!0+lGEHSNj_R%1; zEb5zL&&{(L=>62zX;?@;g_bI$5|`O>_I)wMaG=7xUlpI|yORtR9Eg))=???MJh1Z| zDl5PRwBXXVWq>vo* zmo#>dS>|kV8gu1f565&8+9B@Fd!q&RRs#K5bPH8y;0ho3W+!vP?@g#DwD964-8$QT zG$D+=7i>Q`_!4=gAj1@^k+T6~hfJa=sEKAi!Qvg;el4?K{8g>%Ee$4MgadwSh0z{l zx;cPPRGM0>bB&sM=|8F_vuU-kSkshX?pv{5xn(jxZS`8sU{2SMy5Zwl9+AK_!;<7_ zh5PQnre2xVMnkMJv^^T|_CeHX!2&yg7e?O)B}}xf=Zg*+Ln6Tk-l+5#*2;8)e;?cx z@y6tO$vC14^+Lbl@o|`(m0^4?2E4uQ!jIm9A_cdial}T+L$qzRda$ooh!? zSF*-pYJqBif(1n|!})9Y|3fPvlEe#(n7Ia^sY!skL!ECDJw(-JjN_F5N&B+wY9!>0 zJ>{)9GmpumD0D{%l=~RSg$e#z2UZ10V#L|3wc^Nx7>C$gnmd`Llwr z^8L0X`Sed8K7_v7`}Wr-@US=Strz%MKeoi5J?cJv3w^dfFWYE-+UI`S>-O4H=g=hi z?%aI(C1dBm-))=xEN|gq-))`4`)%*rO#fR>{@a80(gpQWAMK^r_S3(%g-v;s8BnfKwdhCKB~oVtC{YAlBMrZk&57~-y=up(xoyW7W0a5dc4k| z!SV#mnr0*Ur7=aC>`QV+rYXyAwV{V{+vVZY`j{X68Tzieb?*+U#bQ0Pcf5F$9Ca)&Y9$jM1 z%*;;(a=ExqOe7bd>mz)Y3d9%iP`6+h9ta(S_r(f=$DSO2!sU}L^U+vF$nzJ4P_j{^ zF2sfqvZ+i^EcV*fdOwANPq`#knP5ufkZ^a-zDLZ3)~qT9;txn%mzm3i^~=JZ#1_c z`PG_Y)VQ_gb^PsK(+NB-DY<53vEj!p>zLvGl+#V*gY{3bC3&QQ4wKbMnSPvp<~%S*0jETXMWV{_)s!=s6C7*W6o_ryCeu$w);A!jY7YbB}B~>PD<)9{ z20grKn8Ay@NE68Q`d~76#B0i3ZrcqqB2j{AhN-{e&lrAryY92XjEGm+Qib*0ISBp@9E?VOU|VvQ-ax&gdx~j;Y{Ax(@Cf z#Vui~5N*#DKc>`QbtY;gY%>egT)eV)77(CGe_l&&dA9Fb<+X0%n^hv=S8~(4<~gk# zh+4q>cP>=YL!0Dd6E>V{TM&FJ-I`utG1c72a?wx_5y|}{^9W^_d56CQL-2(?r!Q~> zw5#3S&8j*ye$nXP7SV$cESyo5Az^f6lPy$|HT|gOylTZQlThl#R6fZ9$fwTE0*e!a zf^6!*pk!89fA-^5LT$!)yOBmR^eE9IDws;OiMi0D2Z*1I=*80P`rUFwj`My&TYaUy zzhrNb+nwrgIbt%I^h3x>dVl-2^;J-y`}ZcZt=Au0S1}Zmumw%4OE{aZwC(6W6C;&l z=S*XA-ic@gvMZHFZC%y*6!Se-p--`kMF14wLD}^<%0dLq0J5gu!0>r@@KsxmrjJK< z5q4i}5C?M4#jL?Eu~%$@VNS0V5-NEiY?WI@ul8Mi36{?_A4gK~aFB_L`^>SBAKCcd z>WS!>(fl@VZl*;eY8CMHL`l?)i#_7D21<&U&_+cXv2GN!}0 zxf+l>q7sI#&`2$4OdXa(JZ0yz$*}tk|3L|3D9oM6Xcvj+;);Cs?{Z3&;p((tMpAgW zFjcL6G|d2pbd?E-HvK2_3CfOA0^l^n?TBI_lnZG})hJe-*e7TAD^!h`uWKf-mR%Tz zW$$VR=K0`}N94D)1sU+W!97K2ZCuFhNIiAjF0FrcINd3X6IRyY2)7z3|*dUK@-+Q^))a96#@!TRyTNBumL*?08g{c)55zRpzJN#9!savSBg z!8x``2HMmQiOX`Z6sBEQ{tB;5f8e83WMizi7O&;X=Dj?fof#BLTcNr(a8L|HlGF4PJ2v48ZWn=N4<2|e9i zHqPar8g8<#%?obFFuQxyTX0%^i@rAKaHiBS&*m^nDn;1Ev^Y793{1z$O^t~RXAKY% zP2BussZULjU;3ABI;l23A}^enzqCAqop}AbW_b1Q?+0doB&#JhMsa|ePun^M9L8|s z*PVqvz}=FM^}7VOLb@#QD8I|~P`+vGAsk@m5MOjf>31GV2!#%_6j(LsUDdyQ&Aekd zheyBDu^I*kzxHilJzhE1rr^YF%Xt4r*C;;pG-C$@Bu4nj=8})8o?F^>At~lP(m7+# zhGGbGQ@3EHySD5u1DdZuqq!yYx>fiG;d7|gyK)_ZEpzdypPAqjV2@rgl_?lwHStYz zA8ml(oip_I3k^UM!_}G{IZ~O{yDEj6enf6{UL~?~**P;v+{hTNAD~FZ;UYX1?CXrok~{wdFU3_jkLkQO}?16(NjPe zOEP(cGE&Lmr_rW6@Tc?lVJa)uE>G^<8tgdV=X9htqiBGqST2=5l`wS>*0cXQz6iZ1 z3&NLJSpP>N4LU9?#HuzcIELIbZ`dyHfT#GOv8~!(Fp_o#q_^5p*l&im=>!GNR zYXEF7tUC^c=FDC=GD;f@aqA0w5!j0ypTf@{QH z6&=0$u`J$@-5>zbv9}!_K65XW@;RNM$ph>)95I#)@pj{BT72GmSx(1S_94OBkDpfh zyd_h*_FlLO;fhQvlT2awlwL7Q{_88KAGtg5aE>$@!rXY<2ImUZiJHUxTANcW@voIL z9nJ0{M?3|WdP$1F?EfWxekzN%)m;!i?tuo_Va3%2N6RGWt+K-6ApH|w=ZjX~3{1{X zGYL7L)DV%m?r)upMkj{usa29`Y1CU&yj83oYm*mG{}tC3PwBZHquK5k<2yB-AM4jz zgV8T5oI&uNzYiZlG;k@pWitIZ%t|D|5l+PcH$w-!rMeKNh0unY9iXifQ)g66^wjAs zdyxgF$xTgXEs}Vl|X_WCQj;$cev*(%@4u5a<9>&#_@S^wL8G?LHwuf^m_BOSM8-eZ#k3oKq;#3#EVEnrR{I0!x^5Qf3f69 zFmwvJM?zf;=5L%8dpNO3@b&*H#oP;VYA4Fth1{c6yuMF}&a+0)(x>ZGHw^*Q)((JQ z!wk0Q{IAE_serz<(n}cmz4y(Db?tXB@W#O9mBy|p@H2{s+sIZ@QmQ$U`wfb%95&3O z`Ww6LS1l>mO!9Diy&{dmKWS&{kYTxR^O^NJLd;Z^EH1;$|1tEW7-mj3l@(Q^T4ZTHL#FP;KwN zBbUAfM^hb-jihph(@l2O{@C46VS{|I#NipNbG2( z7ZpX-U&+=bCK)SVO9mU7v$t3$@vFmAoIW`B7*#fiR(FVE<=p^M(&YHxv+ppgFI@cVe89aMbYtT#YG1#7taxSy7#TzC?OQ;DhO0G@4^h+_FQjPZ_Nie($7RW3y z(!QQF>ve}4ub9SxPA}ZctN$Jlq+o|H#j2`T+daBh7xLubpK;b)9m?W7WX%q4*r64D zrtpd6M&vGDB7KN4{}b@`%^w$=pR;OEO}Q*TIoc@dqn}_d)rO&&u47a)wf_`nt{}-D z?Q$OlCt6fePCY|XsPkPHYuooKQxe~ls#C)%Kf2aU(0t8xW?>kP%W5Fc++FQwPINv?#z8p!FkoP;B|D5jCO zDRE93J@;(N{YoC2LW9?K z5A&l`1A)r8rQ3d&hk#Kgk=3uWzRK9qLx8j;!y6pRzHl!O!fTS;ayqvn_(l}@*Bs*D zQs%)B?M|iAY?m85lRrn|z@(jh4UQ}ydxSNJ_@~FBU9h;rGeU=cSQ#5&B$+2|KH!B_w-*BCa zfFCqKk((~G$i6+st6X+|Qq%s}5Xk}LSk{gxOF>n38DUbg0_OhjHQPv{GKa>$-Tvzs zWVUSW8q11bvTl!JG>j)SLHOHE)+35~#A!EF{thrFE4{v4GM!y;k)3UDNJ_y8=}o5Q zN6|L3qskN&kc;v^gD*aH$Fn6$I3U!TT( z3@|#{3sR3z&92an*Zz(!)+O@`g1c+2JAGV4o3xYH_{sQtLV;NQI zh=I=1ru?h=+Hd==6>JL%7F)TcD>)!3HI2{tT}{ARcgzpsm-^W2;pknz+_*a5LfrWX z?M@EO%mnL$!~!O_lHYSWlb1g{F5TenMIP=|n0ziMpkyEeLV)7Gu}fMGRsFi_VxP7*o>0sVsZkWw@6 z&7CT_&0T~WP&@iVDf(gnbmrR#mV9xsXjeIxVhmtSHLaVW64U;4OngV^DRC8^HzL&3GwY7g zg?Au`NzdaG96c+u4=pLs5dm_$eq5+qNkjj8auk3>wo!f4co_&2)%zZ|?EBBsd>xB3 zdw56R;^;PjuLp?#6z~hV&=I{&gEfG1vz~)Fd3F3Lo)DRa~384q3swFNo?pX`lmpTcT@Ba5>RZfgk7~FL4Xlu1M8r{Up zz^hikE&KKCo{&;Ne9spV1PMUkubfDlH^h|CFo{AnJv~X1*-482#ex%s2kdAHxd@`Y zDrj$G$dQHxPh(X~M98RCn*HR=AvWVcIKe7GI%J}RGoq47nL}92T9jXHlD$FZ zH_aj14Iv&wc&GW8xEzmAv|~A!X`LPHm2jta(C$b+9oTURVh;sa57CpbmwAN84_22C zq6|#VI(?Vz@B1SroqM&op_y+|;7rkP=isLGMo#t*74Fsw8HlsD|qY^cC=1U zNVv)){;Xf<*5IVeL7_rr2cayMoEN*>bu8YC01-%FdrLBeM9(31V*hcCeLIlI$rhMw zqPj`l5gRcS1b_`|gU8rUw>uNE^}48#A(2)@j!R(HckdBW>Jj6#vY1(YzQ7Abe zdV1A2CWI*a*296G{<*Nz#J<8Y3yHUh-^QGcF@_PSsij?BS2?S(R6VRs0yKDhc6W|| zPfkiXXS3g*qDQCk7A7Fjsdr9>=vAoW;~ER!Rw?lpNLNWnJeKcU)xRpm;e%r{Mk}e- z5r&LVo0eIu#L6RYzVL*dbS!YW!zW6-5c@U|Pfw#BE)x*l`5)GO2ejPk;rl;IA^jJr z!wrTb5EMs9?ET2=njz7y252A(iHnC1&LuOO(kmWO#4BvJ(bBI4`=V{(aQ4Nu54RYc uYv@Pyg07*naRCodGT?c$rRn|ZEO-QIoAV5M7y(UzV6;x0V6h%R?tOc;`u5ESKE$;5O zi(A~jYu~j}YzRtI1W_p>C?GAN*AO5OAdoRpuRfbnCAF50YI}+%94#ejDUxJMDP@Wv(Go&5Awls{ zQat`92*O_}6aIJ1`Bz90k9G+X?MPCBQ*c2QLQ*9@S4bf%alBIC82=?9DkR~rL>uA! z%k4@q?`a`K0p>j|$Wh>s+G#D$R?t8=PFKb?FUZMRRqh;H{ihI62$&WDJR=k-1QY_1 zLSW>`k#RY@3)^Es?Tm#q9gA&eBAG6wNW+4QMO|W%$Koz!<4Exs(7ZyF3MdIgq5ujB zlm&SLpL6iQIRwQ8f5oBnUdcySty)zb(Dx9Gy+Ni2pU2)fI`4C0(d(Y-P`wX zXLnF%JBf6X4lMMPj)lE57DO!c)B&Gu6q6+EP;!ny{v2Qd#ei~1Xoqb0Zqw+{zN6cY z!ODQciWCA00V5Dl3V;!)sxe~{fsP$Bn%k-Sx^+RG(p++29%wfn|(I;q16Zq0fm540MtF85bzTLHrpTBb*7iy#*4ko#5*c4 z^cmPE$J@Lj!x4bh0E$62{1~7Vh%B3(vODx{v0H5?7>>M}z+wm}1;An#REZOM1k%$6 zq)TBRj(vFiqwm3~t`FYu*_lp}Nf3aAfE^Wg;@W%-$Hlcm+ScZr*qUP!_7ocm0aGHN z6aZ6R7R6Mg5a74_+&!lUI7l0gw|idjhhvYrZKU{7^9F-}$b&+#7FL3_8adW>?Adaw zvJwP?r|N4p1e5|`wJWOR@e6@hy2zyR^YlIGpy7Cn9DY!&8oE`?ZE{$wBL~_28cQ`c zIRZkIATnVCNmvLpC0mS01Sgx4QxgP=1!KjldEYcyz;LF zf8$`vAB;DAtuC*nqJXxF_h^^)F%?l>-P7v3H4t#XLa+(`1k1=qONU<8Ys0*G^OV+S zjcco<@Bsm(0QdlsY7*TDJlk5P!clJ=%=x_FUxNj|g+CJQ6JNmFY%b-B^%%n8Pgm78 znh+3l1`ovLg0y9#kz?7RL)-JCiG9VZLcm`Hlmg%{VyeCA5m-4=#%1lGVFGXY4ngCv z_z#4ae$e-Ni8w`D#5=T8TSCR8)&|qx2*EKZk%M3h96y)YY__Exdo=$>`40pKsOoJ# z1cH7jnolIfQ7j_xd^efsI7<_7L*IzF@zHq8Pc{k%C=;|-EO%N3j*4&bP35XF3Tv~B zi*15JY!`fvRLP6tn>1OxfB*V(X5mfop%4fZ0i^&0ik#{faRgp!C7V`Dx*p5#ZMc!I zMbBDcAieqX6xvCM{chykp0zV(Uw-B(x#| zN&&FqRkg58ue6no%c^KR%=@>(s6QSi+D2v&mm>!DXiI6Em`8cA94m?u1cWHVLv#t0 z(7CO&_$8b2HkHPRJPI5w)@<7BDGyHkeERh1 zDtsiOS42(j4gsYAxI;x9ix>j`X)oJVmeaim*Si;QQ|S?7B*YV+6^9XU{ub@kmQgt= z|FICmYwF<;O^^cy-%NWm1D``Alksg3U{k8C_ zw`_S_J5?c!a1qMe&7*v=%bXWPab*w!T>e-t)imw3A;WtvQAvjkf>{mgGXhEh@EI!A zFw_XVkSaSns_8z2S51Qlf6V3EFQ5ao$u^tziO=9xt{lljeSevIJduaA#50JrHxB1# z9WpnsiaVp;VtEUi`O<`A)0A8KEr1^%1i05#$ztRbW3YD{DOpu0Vo28@EiMgGHGvSoiNj8spKq3G@1(FJJ^uSK-BNVe&z5)@r1d*9ih_iTj z|GQyQ;tfoic*!MGp@ukE(ASMAIN33-w7&@eV ziPA*XCgDo4VJHHEP=ZqYJz0tul|{f%q%AqPQUEM@S&b2ji}Dl|(~mIvFI6a?F&Kwp z)G{iht=b&gDHbbVflvS%1!HgsA&Lx62e@RhBC8{S41eo7W`IG_>JcgDX zVdY2}m%W|S^wMu&>hEY-L1RF$5>WtOf%lxg0_RYhP?5C}fD(`^h4^Eao+&d{ty-n_ zgRFhI1C~xH00Bd1-Hy(1zSVRm!ufs&Q-2rhN*bGz?GsDy!-5NZ>QcsxsD;%a#C1 z@$&1as(CavKeH8pD-v#lRp6-j7FGeocPO$X0@xauFXP3}a&xl}T2eqIlwSxa1;8)3 ztk?LZR@% zvK|6Z0xIAi@b6|VQvS4K$0}8a+IpARXNi;o;4@U#YKX;NywIAaz`^g&_?%`f>AXvG z*IJ^Kp03*;^3#zop$N<%I=Bp00p&8~j2PIXEpsLr$`f0>1FBj?9Rj%fPau5osYA!J zX5p_g`$XLp44z@700fU=)Q#{$YdPHRpl9LWHzewq4*|n%hY?Nw*!`_vk}qk;yF}Yz z6*zw+1d~}{2(CN8R)Jlx3UH1AMHWLqVBbfxJ)WDl6>71fSVF-4Q!thgh#^^DYAZWb zSJL0`#(R4ViCs_BvHv0JHCg}GmkvpXR}f{*B+6Ot@)xK#P>dbm?1H>CkY$^Tje_hL zlivE`VryVdoYv^)2l6&5)z|u$+bN;`Q!qwAu)3HW)|a=E9>>N0Jr@7QR+m>#zJ{n+ zaNl;KxCGyC{quRS3cN+M<87j16+-WX_l(G)E#htBZGv*tBT!@!1cWFRB!4^f^4`y? zutAGlQynpUe+udhqE49?0XX>$sFw6P7XHEJsDhYQlm!_fxw=Gk>ps-?Gpl= zxBpxT{SKjSPr`s5=ToN`Xf*5>M1voJ1)x!IxBj_Y>GTs|e}PgJLhrnDxEkRmF^l$U z%c%mH1r$X)0-~BU`iGW~^0cZi5bf8}J^#Ty1>KLSjz$=P7h1}Z2yuTEZ~fgP%!(e|+asNRvbmlE}x zLe%|6|NH{#4TJ-Q2c&zu*q`2Y5f4i9PtU*vfha$y>nm0%U@XI((n)c}7<5?dDIh5*d0tAA4 z(wRVjSZCptma+}rt6s*!e^abu5i0rHk8o`dbRAD*YY^N|A_AwFMSZ!}x~|AKs+mVxssS2=3_?#e!Rbb?o&|K!x`= zu=uyMf;?uEp%GB+dneJ59}^`c2KQ5`E|;`#k;_-$_(roy8X11rQ7~Kk5dH!Sseled zh6y!m;0OphZPT>-4&`Mn4tx;RGm;1d_f(4{=P^9@D{W=tvP$|F7XBZ^FbrW4Jt2wc z{_Vj>4b)`z^iG#mVE0_2%JVhP#O~)@vB9}La6qgiJE;my(RC+?S6bQPf3hiWQ)zVZ zt+-VRK$P7BFSe9}@YeqhJp6k_8S7EW?tll0u6)LrpGj4Tq}9K6B^ZiIa13CYlL}>t zxhPS*m^j&xqUb;XwFGvPChk0(m$f-MI96OT0-Ay$IuMZ4rS@Ek{5g{Pe61G$@Le+w z71Sek_~W#}flz}c0+9oO^t5iDhLlJ{<^43(zL+N2|4ZE*SCNfW8Vj>uapyD1;rO~^ zTE@?(PoJ*V6|-Nk|M6$ct4)*$A1!P?-%hrd6*L<^vQg2(vlaMk`#ls5`bhsLlJ%yf zjn5*K@E(`HK+`t*?Q7z~4uWr8R`ZDZ><)o4I!oI$SOvr)Dnwx-Mdn5TH3e2Suxa<~ zKbEB~mbot#lxsz%M&S8Y@)lV|pWr>Sx2YMmAaj@fhNxv9{RRE=$2tC==;&8OTVEwQ zg&H~RH;|N01hc3vDjWWVdaRq=H))babkqB;B1C8R<8KU?C~iQFs67f-4wQFNs_aXZ zqL{csA$}9?!Ba;gjX-B)&7PLjH0?l9asJLoGo$ABjDY?V%5y(;#$W`H!@p^@gPzAj zZkoYUso~uq(69xH24OMRD;jiSlce{@y6KEVi5)Lm1sb=i|1;yLfYYvO;b`H+p%Mn$_*Xy zt5KhU`cJ0%ZPbx4BLGLg9?+l{VDax0=Bd?m|3hHV!zdc`wEoXy`6F1E5#O&z8n&-F zp8zKqYJd4ftH7@JB`wDs?nqzm6Ii*a~n!tUv_8 zJUT4C!8b>20T2b!!VtF8X0uH^cx;OWyj#$c?m^FoTe36HQ@c(5hLn(Sth z_n!602-wy0&!fB$Z}9!F2>X%8Cb_H2D$wT+qK}YYz*9be&esr4c-QmXj8oYeNjs5p zc>8Q@L8uUV=dDvr`LsowL%UF&u$WYZCNuq>a5tY5HZdh9FMFYx_={_47f5&ODRb-03P(tQ0(u=Q1h@cpW8Pv5@V;`QI&Z+M5O%UJ#S zFU$nTP&&HCm3H{R5+X+o`wD!A39JD7#Ai;c0OuD_WEuqc!S?5AKf2}r5GkNcH72+$ zzCC43z^Ij3c(I*K!JFiJSop_SSkG5*>(Jt{Zl?qj%$sBip_^feUqdRsV+n_E;gfEEy zPnifaY_;i~iG3u^$Kv0~YO+P6JdIlu-MdY{2EegzBznxqm3Mf5VLFu+K{|6D6M z4JLnH{8cXhNM48mJ18s%lLg5s&6}p?6&9b| z8kQN=B=ryo?nzT`ICa1m1m^aY@p<|5yvpV83tC}pgI~kcZxO@a$@9;Go$uaY=RX5H z@Vi_`bi-`Va|eTj17RgOpJRJq7SW;4FcLJ+SSLG{|J`DV(^ufQ$clA1A}GIjrCG~f z2o;=Xz^^KTVnxB!#yoAJK=4Shi1_}rDhI(6R$dw@9@M<<5$JRklJCsb|4D3qS<;%{ zy6+$C(VOPN`f!!!`8nlqHEKU|3gKYr+)?-nyoDMB@E0giA@oit3+NDh1>V6n!7>ym zJ{JtUs&4=Yz-qN#G;DZNPR>SkM+Sgjpj}{eR1_`*o==l~9CpI)EYg`NG93b!PbX^8 z!}H?Gd+VP)N>qL}^sFa#LeZf=U(6HWZid5O5X~J&RD7I>odw+`7;@LI?lCTH+~IOT zTw(Pxjr0-&O^Yr$iq29$qQdyU30TsG0HoPp|)Vx`$h6sUGp&M3>R2KpLr%v70>buVf zOz*oRJ}JM~>q3gVeeR?hMg#$0Qty8IoTRmXFowNJ^NBj>SRdGff5rgU-oLLLa51Ak z-^UigJw(Y}eEXRjncu)yzN4jGr6{HCw1Bd0bBP@Y6&Zs7B3j>Sn$r7z6(L{{zQzn2 z+oN{un9*ER%K42PDI*8Vd#IP=TBivywox&!^b@e}-T4~NizGY$%^ZU4dWSFVh)BorDk>}AwR*Q(W@p$J>^)+blirz=7R~2 zE;Uc7&k;nRS$m}3-K?K__wY(d3nv@H=yi<92EXMZa29IDG|FiQdKfQU`XWS&s^Ut98 zxTH66d5p-X-}7doaj$run-N*}CrKOGh14M8@W+1GUfA;?$_fYY(#jT;7Cqo_2xUft zGbQp|(AfjXD}eVjBQP@v2E&Fery|PMKA`PlA)OV64Vx!c2Ieq9X|s*b&D-k1B{o)& z2#uWjPoL1tVfj%yw#&Sl>~ayj{R4WXPekI8!S*TClg3hGnPPdo%pzb{q~5*WOX}SX z|CIDK67(2Bw|qp@?t7kpg7zvXAN`3+5#nbS;)n_MCFpYpQ5yUr8n<-Mzr7OG5@9tt z{5jD+$f>fu!@?rgInxdw6suJPK`=M85G7<2H|8G8`XZQNR9{&C6bQi~&^a~p28VFW zgP&MJa3kRj3Xy`neJ()HFIBV6Cvd2swpq5%&G-CPNJ{3Il~(hp}$?3eH6rt9c`pSx@{&kPD%v^^c6P68u zU(Sh*;gzQ@Kau|4oH|i2c^zfQo1y48f+BDXX@_InMB@8JLBb%q83}`qsFK3IgI2R; zXnxf-M~s2bozgNMfv5lT5H+m$wUFsF#4(M!%d4^9kQf6<8zUm8-n}nNznBhJ%$qsL zn8m60ZAkt5Qed}ENj@t1y^FHGP(9BdF$SLtqc&(tH2Gr`4C)scuNTJA`+H(DwmI%I zUKTwb%yf>e00+bh=N7?X@wKuF_;zt5!UP{Xd?Ncr-H%eNVC=*QOjH?FU(ulh$| z`{+D=d{g0c931cTxE@~;eQ#oD$c#A-hM+8PEH%*NzDml5* zV+(bn76M8Es0D}TFTD7}Jog*VEh2NK3?9Y%wH2@myhCMl78?U?v6I+5GR#E5th}&Y z@dy1y?ch?P9d8>W%+M$C<~~S&et&09XeOM=j0XIGC>3FY73ZJ~f@MzZ*forj!+eT@rvppaD`F=>S5yXfbYLfk3(4h#Q)6xcyEjjYK<(!L*z8- z>KN&CEQ$`U!^7o>r;&R1Vg1{F;jKu$yCU@baOS=HwxjAG7Hm&cepZqV0j2B!7z}X+ zLG}}1e*u5<2r!=y?(y!V_|0D>t^d0|m#q-ZI_ww79Wc&!d6qvSY1bV6abx`~S0dc2 zEvIc_E*%q_V;zqA@(c0H+!NVQV-@Kkpez7-=-?bX{QYmw-%CsLoGuZkX`lFc{{-xaX zf^jD3tN%&FPHy3FN!Pze)0FMwHZy7t65YN2^IHmQ5=>uF5QCMcz+px(D3_4F-> z!G{ub+{+`eC)(*{DCD`8{Scn}M?KA2|9Hs>a=z8`K0llK^@x24I*vl5!z}$=0bJ#f zaS3+2LywneIM)!r>dtZm4RYK~&1Fa87l2}s9}TP<&EvHQ5zJK~f}UYk3V;V}oJoFM zasHZzCQ)^`m`*xPhFi7wU==9AgQ62c2@&TNL&W>qdVA8Gde`avXMn?XYt$1M_6z-m zZx7y-`E9u-aTdY@OOTLg22A;$#Iqc{1;UC??kdkCUiUgO6Fv$j$lKYf;6P^dWU`wwv?pw z(jRyKN7$yoTYVtJl@;^15OFaiy@-KSC{248xVA6q&eIysju#ZFV75Ezj%$_gjo}E~ zMP5Mz9d}{#uN{@pDOd)eLB<~8Miw`v?g4_K0N&C!B+~gmTyeS|frW*>ZBSKuMjE&<1QjJq2Z`}By-@7|OZ zN43k_UvC_}bBr@95PHsmtlTtf3ngG-{gK$Qur818wmUe#Ky?f|%ky?$s_c!bqqk5u zBoKq$2C+hi$u1CX5j$ifAtxmzrF~s=KL1eci0xfcr2y2xh)epCLoR{k3^Cvq4_k$u3|f9_>omm;5Tb7Msw&>yboZl|@-O*{Jpn*SdIUlm3WOU|4Z@5PKd=mr{c9A2UH3&F~ zSTUWTQc)0Tw!$@k9G>epCndIBU3C7$k#J3F_IdQ5N@nLig#2}ElQCF0=nKU9Cxvj> zs2z%P2@G`H2@m7zoLdA@D~Jcic@gP3nJ8n5E7k3q-$~m1l844Y9{&C+{dBrjC6Zq6 zha^7dgPaK6Id^|wC>(w7hQB}^kNer*lf>qCZ^T;*Q`UQbG?bo}v|tjp6n1(W(ers$ zTBd9S->omsSA1O3S5Fh|`M`a@jA=wy{rzHl_pRz5J+oIjttK2|SW#5}d@LS0359

`2 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 literal 46273 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 R)Bp(hNsB9p6}>d_`G4OAt4RO= diff --git a/ui/icon.ico b/ui/icon.ico index 64884a16a64982b1753ab1f6529045de9c732787..18ab392925d233b1e165d9ef03f2adc461795ee4 100644 GIT binary patch literal 39299 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ϕCPc%Az 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 literal 116398 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

`2 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 literal 46273 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 R)Bp(hNsB9p6}>d_`G4OAt4RO= From 9e16881ef091dca64363d89234f5d28b0540a681 Mon Sep 17 00:00:00 2001 From: Roman Strilets Date: Mon, 4 Feb 2019 12:23:37 +0300 Subject: [PATCH 019/136] updated icon for macos --- ui/beam.icns | Bin 5370 -> 201030 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ui/beam.icns b/ui/beam.icns index 23f18f6319f39fdb53272bb1563e4a0a3df8a89b..1ed2b96f2ac7d68f980333a3cff3c6a7229011c0 100644 GIT binary patch literal 201030 zcmb4s1z=Ri^Z$#xo!{l|-Nof3fe^*rT}pu#r=>tCZlS%4`&~S^L$MZVsUm>_Me9nv zrS2_7lHB`$X5U>%`~QBw{Sk=Vz1`W_+1Z)dnVq@0Gap^Tc|{DEyCkhM$9aA+hL0V% zzOZh2hDH_{AE=Jf&*H{3)i=DbXU*UkrGgi-xzMP7kJdf+%E@P%rlzVmPS5M)D)S`! zvqxSzeqh$MZTXKhdCzP@5m9+*#+qbDdTn6&+?!g+%pT z>cDe-j6@zC!X@6{O{VFD*HII5C&y_XIGF6Ezd21l{`TM_th|R#SIB$mbUdG` zRLFxP6v|+kO07^T6-rrmxil>5q27_<;cAV6Q)`q8MTBm`+J&Q114E@Ut-_`ZkSfjN z$38y0k4|n?S`~wo3Q2?_wPeZcWR4&x)j`uo1xLseI)}^fQlXH=y|7j*mq{aJ5%Am9Or@|Y z<79>-=U;qs?t)bdb*zCbx_fr_?kT2Z6J9HnQl%_3EHum}@slg@e3(pWQ{^c=P)H%y&)dr|n9E#IOWUK&k_ z-G2GKcce0X=_Pt@PE#Iz<;=09*#jeEN8xqqgZ4l3ZGT+YIl^R#v6(bU*DieY!Rx=y z>S{EZO~w@MvO9Cu6-{qhq)stfP12;S>%w0@{_>abP1i&`HYepwo?x9EJZZw@oFp@b zG9^Vt+oFP^qmuBqXUge$~?Q z)y_=L(}VNi{OX;UEl_vX`_aqeLQ89#)7jSAA{_VQxH{pM6Enqs=PjX*>)L{6c*#1n zwRGJkw9-@d2L9ak8IjKQg}*)nDcvs##+`q@{%8At!u#iV|HS8?`2K(M`Nw?c&ZnIo z$XPkA+Uf|j+iObe7hB{?-eBXcv`_SToP=+vSyEwlIP5ic>+G&td8A%%<$bVY@ZZYG z@he+cQE7KnHC}$Mv3m8WM1_ji=kZZ^%wY%Lf2gRb&R*rHxOCwBi%s=KvvL>++P!(a zHbjv)YE@lR`I9fKzxLFLvrn$CS~)xc0OIs9iHTNTtK%bO+Uz-{+iOp}y5;#-wp?m% zXe^qU6)Bf;`f?kuA}OF!B#v0!c;w)VZ`YmQdTsN@rmAH_60Dq_Py_;yL6Hhw&Ww_$ zcJ6v^r(f7s|M=>e3ot*Rpk^SH$s<;7s5`p#^HXmhI{3z3dvzr`7xGH#t&!`y zJyPCy@Rf6$H(zW5B>=RP57#SrrP4Tl)w<_vPi!l$wmZsrnNA-atTv#Bp~sxcZMF6) zJA_;b-j9w64kc7{DwS!xt)anD$?I%P7GVgTJ~lceK&jVZEQ3z2@BOHK9f?ZJUZ>>^ zJRcJq6BZE6M=4Y}gDt#HsZ5G4z-KVZ$XSGEn7MER%}y?eEO!N~Mz4C+NRv+{Bs zuhkfGR-F5?dD)=nUfW;4a$-+Q`*RzKT3)MFNaN?%J~Xsnw$TtDm5=!p@KPXch)aly zHN|*wArW3aQgBEi9@%&a#B*#6Z-|Q4X(M&vfx(clOM#B{Gut-;^_oCNDB;CMm@?eq#&S zq`ne~N*N~8Sd|=fgB9O-T!>O4kx3;|X@n}mTc%>-*Q)e^_{D$hJ2dkMmszF3VbOIn zB!S@y6~sLRyhcS0IMNvrQVIIYf~!ZCKc)={lmH09haAsWN)&RbMCLbSe$vsgD@yvR zeIw*-41g_EMk?fCiQy~l>2veD)UQ=YLS!mHS3x=8mkoocBEr=}M=ai>E6IE|JxLZ2 ztW@I};bz5inNlV55AKuRcdq5=lH9!c7XLtnN=k$01H4?RQ3Uw&ArE9Xuikmzxb1yI zG*WadQOab|u?nd)EPQZ5S*J96f`sY1BBfNJ4q7uUM2-3RsVAvdWpi?gv;-4Wh2|X3 zHG*^)-7h>&D#L7*iehD$Dy-?$>S;0}h)S&tms%yBcwhqpR=lSU8h!bt)vI&D(NRt_ zf?kyn=5nARSE?0}`>w8=vUZ+EA(uxb=mkxrCXX96vrqanS5^%h)hB;pj{!Y8Cu&)5w6TGx`d+IJeEQw_m{&?-pkH;tG=JtfHFT^98GC~%00PVRn{hSv6Fs43h4^-DhCGfF+cF5Ch>GnhXHZ+4 z^B3XVK&`=)Vz!#BMwHgLh zsP1?2yXvCNSt;o~dsDJ4OhG~?MD9bsI5d+$lBiBJeJno~>$eUH*l0OC%o)#={? zG}_wGxzMBp{N${Z_&G1!boC}11we~T;V_vFy`YWJ_jACQz}(ub&JvTtXo;S1yLEDG zr+BS-?(tiKvjr%djKwCoIrhBZyb^CVrx*=}f%RXa(`^$-%)#7J8dLZs!p)n)DqV`% zoRpHNO<8d2j$pzgEf7gIS&}<_Dx7~s__B*JK4HMvt`?(SKfI2*M;cSo5)(AFf-rKh zAgq@T%`cjfgASHho*v7Rv!^W@GwL^C&-k(1gr9d`c*;6C8(_UKYkF)<8(nzhx^T0{ znZ5mP-n?;XyLD>UWIQIySxs`IDcKmaN@%-&{`a@vZ~5b|_x2P{?MB_{xy>Yj?U-;y z_;m0$!u8MdKM_9f(bN`^q@*-0}P@1gNoS5~kaBbkY zF{4I~9@qap;m7U?V7F+tSo9-Bvst)(^Y*P`a0mKD;)@ zY{cq#7|oR_9%f@HFtp>FFtw2#TTVZ0CV!025laJ6yg?l>o;RS^6=s~#q>Sz{npz0+k1PaD>%-}Lwv%1dU|pR8-AvF;R`>1-jKlI zJ@=O<=U;(|w-PIYQ(LjCS}OcGcLOgj?hOIE#ie~O++nu0+d{^R zJHq#AtO17pP5|@{<}<^gMfeU#pnt$sdhG7%{tXm_s{sVPT=<)hK$_%C11R$=k% zL@?WzuVjZr54+v!2(sI&R*z0rDs`}r3q(_y)0c7HtaqLx6z8YPrmA_}b#z+fb@^n% z14;?!oyKvGmslNg3{$@2-6M4sH4TrCNm3|9Zw@SO1D_Mk7jgbPA3dbH1jtw&((1C8 zf4;DDS8?_F%7?`hC>_oUxOjMNrXQu6PcG{f~j+ z`QePbR?mlOI!(!MY`}4}eCMYnTYufLWAByA4aHSW<#Vzl8LsG{*TSCX^j4i2FVwQA z{)-(=wMEBXv|c@X_0Xv|k6w88NJT|s-Kyd7bkf!HIEU#uj?Pqx)LEhK^gv-_U1i0` zmp9fneECfIwr{ULRcWtpESr@XsnA9%lg5tX^7#~Y;=x%>9zAerO=Hcmv(KJw_^GM- zqYY2~u(8};Ra?JuXq-HllUL)s8HHKo@kszr@YALiVYcT!xl-JGA@}*#{W~r;Z7Zs7 zET5X)iPJbjXt|1T{su|a^4K9OsvQmG<=3`Uy?^5Dg=4RM{QB0)(gu5pwb)7r&=NjI zgsMrOQQXw9uK4NK?caU4^QSGlj=Xnjy}cUiMDQx;FiJ=5xS=bm8*q&O`qV40zH#h{ z+7sl-gu5i^sdf8M`qd zj;bn}qyZ43VyQ_$xC@3x8y7`zx<7(7C$?h_M6eX_jHQElU{Ih6Z4HqMW8bcE7!~L9 z(%mEhBMWd}jg|?wM&`aYdE|}cU2q3=9K}ukCx;S%`LajF#&@x)5j|d0~ zQpwa)n(CHK>>7hDJ6x_j$X25ZYdv+u38x#rK}tyv@FR+Q>fX$x&#@fr4tS zTBR|KD!O{}jSc7b*40$z&%JL*PD(qZWFhgr=Jn#W=Gd?xKYz6*QY$hn zhslvMgytW^cj}pCf?^NQ!SN9&hd+vZH9nXcdXJJc zZ9K7Pg)v^l4TVA8SUB2)pf33V2pbQbp#(mO;Nk#pe;|O48S$$TQ3ezj~e`PwCB$qa`>|ns>mrEkz?) zVD~2h}>uck@ zd?Xm0`E+bbPnDcGbZiPlN6=d?lSt%V4?oH^7Btdv6~TdM2dq^fkW#5ZD>|wJzi5R_;^m_%f2o06Q_0P{GrXHUzPm@D6pjg%Q7H|h zRVfAu;X6?&!o4Cxf{t_vdun-p<*fD3Z_0|`foO$^)u#l zE*w7?4!Fp}J%W8_O!R>#3=D^Ns+0k8%~Qu$&W}XsgJu;9T!MnhuSBjTrJ_O^0$0nt z*N!dE9Re4N*vK1E)P*Y=Haz()xMZOy=$N^_nNbmE1DH~^G0hSOzY?ZGYfz}vDfIE0FiB+a-stOF9 zkh?gycZf2%N6!p%jGFBhLX{dO^uKSoDM)kl?5Q(x!^X*%FI)MTsn@VRnW;%Jk=S!y z)UH6uD^w{X=9O-Gy#C^ImsfdQdDVBoJJ&wURc#lClhUpA!o=-PkWgnn5` z1~u(5ciR$hYEa)ZFI_mi`U~Oqk{+Wb&0D-^!O+B*NEKY8)J$}b6$4Y%-dB%b=;i&c z@cZFc&YCPMm#lhNi48(5Ma@L&sIauNue@}*#*0pEEq@5r-uJIvymnAH;N@d0k+%@E z(WoQ|FPv_EIXPg~WAo?DoH1vrgkQ9L`O+A+7@lCOVyv7x$aeYV3uWe<#Q22x$ViPg zIcD6NCAkwKREjc;NPbqp+404+?!V&#w7T)UM>F-~(U9nyEy86oFYYKC{*W~w) zVA~%LnGDTSddX+6URJo=bH(D}MZ>&@j_6N7Bmkud6ZbyorBH?h1Qi8xK_%gVVG;D2 zn3Vj}E?ELcUa7iFB~lo$RphfHBsPhNz=y{{QhB1^1|?{MzsW5}B9U6HW35Q=<#B%G zS*8IRm40j-Ffxf*f(;>5OFs%An7x&eU6g9}o?VnqqR58gAp}7&E0aZTnO_FMgRc3? zVtnHd8?=WXYpDp)mqVvOWYbGhIpO3EY-{_A6Hccn;!@y!$us$Nj!h;fi>Z>!b8>Kp z1+_Wvyj9*;Z!o5q;Sypl6V439!#d|XL*T#=ZoV+vsEsEG`7YlH@EgN%AOC1|%4iU$ zv-J+zeN@q#C%+_lW4u#L{ZdUu@IIQ-)(Stj0-lwP7|MK%H=dcEL_S9HP?5u_fQvAh zhHn<&0VHo6gNY6y4DJWTJ$Q0i0>M1AOE#OsV@GZN2B-ZyEFPKfl;SVuxJ=X$P&ksz z$#D8`W~(t2FJdA)FF6mF2;7EkMNTOL`fh$VI5AT!W^;nk%yIe5%b3hZkJ|b@0dC7@ z*h&~+a%bui(+s^TiaC?n2FD@|kpeGOmlc=bFKB5gc6zq8v{;>?Z(6gpp`2EL2QmeX z^5A7NnNyPZn6W#51Y9;ZXIq{#SOmOd>Ig2*8Cymm0Z*5?<~4YQn0vF3xjBWue*gOC zJ4B=sY6DQZ*ok}Lc_M#p8`=O>S}UWmiacNzi%!|~i8rlIkCqm32Htq+Y$Hc%r76s4 zj=t{!ULQZ{z;6tK)#*b|@!VNsl9^*JypfP%j@EU{e+NDsG1!~$^h`FPuZ;YkP9ay9 z0%xr*;ekWU;cIR4qyDX!YLzK6Ira0lJKv@!As9_Q-yX%}^QASyAa;`u?${dP#-G9l zEqsM8r|xeE3%3hfYlF)c*s3aUOa1&$FlB{O#NC|NQmx@tx(5jn76) z4&G8ts%|zwy;u0PaO>M!H-Ek*vg}OG~S@#ph1zjXzuO zSX%;GTUu_zy^0Cgi1s9($am~x(HDYJ`GSuKl>TTH?0N)G=&@%!afnw^<(_SY+r4&d z*}S80yZ5%;H6#YH730Mn4%RT5^pUzEEe-)i+8|w|p56g}n^HgyNDC1=OMQw5@ic>M zHbLNU#!dLnr<0x8X7ogt4MY=@%?P>0c|y)n-*v7Y$&h^o_`4C`1(25_B+gjNp3@jm zC#IC%G%9Fe7iBrbaPJfo#5LgrO5sT<{ctoF7g1EiyWS2e0h@3I(Fv9SFhh_YrAp%)r~W8H-__aySk}K$1ix%l?%_p408Ki zpOfZ zbZ8Z3Zn(Gh8_xfa5X#@t2Ye`pul|h_I(BjjUtzi(-}&EvJB2_0g)#r$A8dNB?e7(z zd!6sS((_)|>t6ZcUis}_`T3sr%RTPLd)@E%Do^fJUO~d$n>>UNy+?U_kMf*E?mg)X zu>%D+|KrxgyZ_Kf9F*BT={xFhPx_Qlx+i@NW8>cJ0n$wOWN)B@%bwZfwr4i|2YY7j zQVJ1{hd+Shc5%VAxDJYtOJ&v4V9%I3+=27gB0$8)YxD`1xUd?#z1m@4So7@6O?|=@ zbfvBWj(Mxzm!r6i&Tx+NtFEpCjEZU-f{BiTX^4!mNMRYD4~KJro`-pfi-NqNne(r8 zRM#NhRa2Ai2)5U(a|hliAOzPw?;mAA*aktCsNud4Y8R9_u#R94xXar9cvTRaH0EEFThwD~0IgKrdW4jEe$Bl(wED*4X+C=i{;Y}aDfP+RoiQ5!R)0DUF8=-%eANMC6zQXn=FQ2G9X&6 z7D=WeinqEnm3eIRaaA-x5{4MP%x#FT0zaRAPj95 z?A7n#0`^tc)jJw7Y4nW+kji2QVn;&jd-dfQy?x?Mjz#^VfWiY-}nor5U^Ms()g zi(=)x9=wQRF$J#ZHaMqmLU<{hUf{BHuLV^uJPRCYnDm>%Wnk(k{}fCA{qd&K>hdR@ z!goJ7h4;Wdo+VHB~&^&2<%_pdDvJ9fzYR zhRSziZs@bn?!w&a$gbS<)hAf2>XM7_8jW%kl_fBoS&BYg2(eaT(y zs~hWbM<>yR0J`o#KygmxeDTs^ponD%Edb__Iw@bALxQ6M{N!*{)%_~$EUK+6uHRNw zz7HP7y2{F(O=X9_hLLz_JEmcEM7XBWST-j|E6Pb5BAC3v0`N7Qub$IuBY0gIKb%%T zEsyHA$iePJ5LZERmb@Uey|uft)KLX#Q+C`b{Ia9Gva-6YV%wLnia&p*z6$eXTtjlN zZuLmIfsc70Jgws+v;gnm{Pa4Gg%m6J9GVJUbC^=lSdS&7zK*KRmwp$7Z(gXca+Fq9 zm+b#txVfvM8fu{Iy72lJf^&ysM>&SDI#jeI5Xz;qvRpDB;B)}4uj05gBAvrE4@LBV zB@n}m;~f>nwasy=$3ad*uIoq~lWlP@`E|k`k zl~sHp2)oMxy#hj?;4}Q)N+qAKzzXQ}<|qocjsk36t%x1G3|Be`b8sk_zx0%F>tsXu zA>row%IeAuw}tKH)io8k7A2gbO}wS9^6n06*F1)V;W1H$a?V#LWt3k>lqbwJ>C=iu z%2(5z%bHt-TR+?pUMsDxE@>7%E+?kFD*PdQgxeL4pKffetoWOvAO)q249*lBWt@ke z#f~@ep(5hA-T`F*#BGl3(k-uH6|c~Q9p4Mj;37sOgN|CQeDDvF_dYwmCqJ2j?A1{(ugb&FmiQ8N%e;MQv6YRQ1}HqfY|eT)sMoH z73J>>=Su8f2|u6SP+A6731xh5uW!nmQ@eJVy`~uV@WUxMy^|kA=&BU)!&lWZbfMoW zX~S2Se;}MEX#*v9-1fF`x^PQN+qU8-h1<7bS7gO=jwyBQ6T zE27PsUCNNPIg%)?<#%Cg1px0BZmcVMUidWstZ=QO>~-Pw`ZLgl*Bv!wr6j}179h=D zSzib=SxkH%Wl^wuDkE3d0Zp0?_-DgmtKC>#d{ub8v~sKPXX6jT;o@~SgdL@2jsu^+ zS@Y`$q@P@9LU}kG1z09_CEx(xo#+V^a~>)eZ?!f$RPq)) zl30(gao+ym01O95mE-A81mVuxd-5DUc1LkpwIdJ2izMP55my@bWV+3*aLG_Ws$LI; zg1y<+vbA`x@cUV2JkXlwfq{Mzge&ZJPo9ITwGq)Y$ly4NdpSfsx<+Fh`#5PRt33v$ zCSkU`mddyy}A=2*1<-QpG1ibJ>xvj+DX_0#+r!%Er;93POtRldym6noSS4 z0;Sc`+TRck6|ehC*i=?iUb1ZuL}2+g=beoerBHWx&Vg8*9aq&2dL-ch7TpZ-RFN`D zB-~6BtZwb;u$OJDD>*IPZeCYfUR_a6BKLyuF1BN#!w(!(Rb9hzv>%R=K#dO5(Cs55 ztz-vniK$dND))WdBHVdrFL)XKpcxL(7Ir}4arpM-Ff!(I1lcNdPbmawi;i7^>P{Qqc&bp?rt))&}Su zqNNWmSOM$9l<$MfH|QQ1fV*C$xIG6#bWmF0L9BIk$tB^P(&{qUx}?R?gytQr!@$&) z}%&M(#>@7n-TnfV;A~rZg&BSX(p@BhkIjoW{qfwev%)q-E2C5bd z$#7*CfR0c%ToIz-f&zoEXzT)-OLY{vRR`G8;T7ABb`vpf6uVZ09zg-&ppKo{7Jt(S zFa^Erj#oF(b)mz!$D@z6;*t>tvEmLAZj#lA<_L-T=`JzP(6Tzj9ujt!%#Btc3=18U z8W~?0rd@tJux4OicDL?nBzuVjaLoqO36Se`4epWJ#k0d+M4QMChCjpyiPIPR*l+_X z2yZuuBXtzLH~~=~@WE4b<{(O2W4#%I)*v4Yg;cI4O8z36Lw04)E@R@A#1T4HqvO+L z?4pOeUp`&O;z0`R7sfVLmWoHIejP+9D9`$O5!G$3AsM29#F!SnLK9Jl+lCxqdl(CO8I`D}DtkSoMe>3K!e$R&$rP8mPEfA=otcsf)15C*)C zu9*=dmIDde#(A-UbYBrP#05J*VLY5i9A{9e2dpVt`RGGaCypH0D<>6%02IQ6EG7Cw zr)8i@+*Az2l{~uT$VbwI4D7ZfNf*G<$g*naM@E_?LhX=8eIP6B#0 zcj4(1(|YvDPSB{4c-T&EfWw_b@m~m%q9REQ=?yaN%%@&_a&wcTBro@|sl$3^bvDJ( zK6W9e&_x-$^cXyT^5_g+wBCUcHc5VLDDH$3IIy~2$q>{6L1~OqGJOBl6NmTh*w|3H zcJ6({2K4TVMKE*(8Dq}uJ#^fI^Or9eLAR%I#-RO^7aQ(E(Fl_07-v|605sG;Aam2l z@0>Y)?C{H5$NCUvR@zlm; zcuIh;8l0*N3<>7KAOGs7_g=en_Jv(ls~?>^>%sd*4er}5BQ+`dE=-k9pV+zEfKiiX zE?8kLZP zeWQmB=$UD`OMnKP5TZ>PJqL}RGUu^X`IQY@_PzA#^96k)m2@c<0t-x}jqlpUn+pfN zkwHOWeq8!-q3!1HUtN59gQL9Ix@z(Khh|I}JE&_a-AuiU?{J+VA+7g_`=`%cw7Sr~ zZpXoAPh9=t)5Eh9WPCzA@sf`3l9TSmd19;Sm4TeP?lv6%KV3MqYx9Qss^YxIS1z0} zwqIsSazb1T*2KjF_529*#0sVKp76-(!it*pJD+;t%$0XOzae~5*-fFwEmdBdl#>m> zTqtyOg#TPz^|3zHQ?%lDeskUtGg2}^r=VW&2WJ!*XfeLp4CPILjv>FYc)ML`B z+TBN8>2uU|R1^T~q;_wU(So4bx-u-Mt$gf?ZB=l_wU`YWy8948#dIG zKCyD~BVf=m!v^;0o}Hd*N{Yj>yFu;Xd+Ja(B0ff^kjL~{wCg=uQ%v^j>dXT_o!_}* z_wH>Q*RNZ@VbkUKWShHl_%qioB59pPhhJ^-FJU~I_(B0&%O!zPrm>QRm5TlcZ z>blQA@DYJ*dFS-boqM0$y>sWT-Me<~*u1{J>WRl@j2SYpdqzrfe6&GdNGZw=f&imP zx6LJY3SyJvV7AHS#>}ygKlR}s``53pDS2Y~q6IT2jqaYBXi!E3`}=tN$klY0T5E;t zgabafAk2j8W`+f!C{7Z4Z}92^v3*a`@A z65qmPe9T?3qK(hV%FgN9H9N&Kj|=eNB++`kAv`F!Kot9%(FezDvWB*ZGCe;wK$LO1 zE;(7&Y@e*03?I%TkMs2etsqJAgZv=nnGLfMRwdtq$@PtHBIc8ZgL2^`6La#jJhRii z3pxK#1LQd=8&P4xkl93{R=k$Iv0YdPxRi+@vul2iXV(m`BF+~EFXw~4mq=F#DO56Xj7~Q;_ju1f>y4;?QTUtKB31aQw8uL z{uKe9Ktr?(V3jm5Vxb5I4n*kQ;F@nyY^7+vRt9l_MJ_8ugogYItLrFM>*m4+m#Ng? zHaF_n6fsTr0kDn$Lx{Uut`m8SK~QUO>)m}|uNCLl=z`eDScz`wV+#@4JhX;9_feN^ zDzXWhT&flj=zsdrJ zV(&#+@T$V?9{Ut{;7nzubT8(O`xu}g3(~6Yx&W`yP6Ywrvvah2AFmO7<}4(Sr0Dki zfZii7rM}kXYkg0IW`yt6?c9BbMr2-OLj%0XobD}r7w}EYRn7M18|^Lh>){JWQ3ect z1+*tjMgO>WJj!I~F421M|Vowjcp1R^m$2dP^x4_DXi?`yq zvj^XZQpLxC=Z zbTjZ#fQ*=2J|c3J_|E73ae@JC1m(_gz9fTr9cR@S@|B>OE4HW887^`D33^Q&=0v)v z9>a>E!8n8lcOi7>uartq9zqfxZk2KBT4k_WDnq^kQVJsFYSkq!2-n7Od!EBhcqy(9 zd*W(uC9Z1+XtWv*jqv{*7a)^q045x%CAhEe%D|{l=Hv2kfJ&{#?ea*SN`qO*kY0lN z7&4@SV*~c3T(JV?60OWPpB)QLD&$0FlJD&4Y&LAk$NIQ&I%QDaej!ZWeAH9VhV& z!GNxr$tYokND;_-s)-V+eMlFzfdIg;kwC zUHDh15E3*>F&G=KoW_&}dr05K4W?WB^npmeaZl4VrXBSua9^EQMru@u26A#M%jm(N zRp_h;>MwlLWA%6M`;RV(_4bn@$>r|aVdyFhjSLJGf`KZq0Ofv298$SN;k_9-+g_0- zuNQ>hcMl5n3;`nfQa@UCajq4tCIv7i;vy1A$sKYI-K(W)S!mpkLhnGe#5=q7x6cLP zt;KNwOzcB^&_3@9N?B5JGJ*hM1Oj?!lvV)HBHd`Q&>V~u9q%&XK=9-jTZC_7Bc#Eh zG6gMi2QY1E z7zDZFX&3f!foUZ_d>_Z{5T5f7_euEiYpGQ@J%{%Ukh3MZyS)o2zeR=Y1s2@HPDn+* zPl<@JH_H&qlbR&5;K0ZTWOGG+F7)Blp&t6I@PMIC;aOd9NY6Om$(NkMw>8;7o0x_Y z-Q3b9k1|BmsaUBR&QHy$6qK@22E@G?;v{eYoYK}5-t&c)?R|p1rQz7mzPP0RaX0^v zP`PhV_E}tvYo5-BVQ!2K+>!}W2`d$$P;qKR^Hd6sty`6ddzve|jkbtX7TUS`EBNN; z>%*l!p$f0zUkbnW3Q|Cn_+1b-oEDtjWL*P*L}3Ti{aNYR!s}t-pb}Ig;eS`uQDPvcspNb~=zt3K z9cj(Tp$PX5$g2Iql6$`sm>mV3CbA{&v=Ji&Fj*^SRY)GSfzARqxPCjYEb3!a7e0<#d)FG4?mne=_3LHIb*W3li_icg@#KPV{kx*)v0 zBHqgna7bl%NTi6zsZ^3srQ)!-3ZiUIrU^p)%7SvfdNl;{dAsnZP~;`K1V_iyBPBkl zuqB)Df*}04v%d@~9A-k8Oon)zMn=>+A|~RwG0T%C0+1pJavuAvh# zIid347lbu_Q_el$162*2g2SW$1slVS5~(DsBE&6-iJUTk)JAL)?&lJI6gvB={JpaJ z1<7QA+0H-Bfj$A@QpRG)K#f2!PNk9~d+!KjnL1?TKvoLVr7j3Jn=}$c^*3uh9~XXK zli(ewfIl57sY2L`B2%!tK=p_SnH0q8(31xrJQKKGY! zW6$8wFoi@KuKi3H=?j5Hd!55beiBa2N~Ilvk)jS0F2# z1RrDt$rRo*gg4003L-9&AqPMmFZma*uTICgZg zvf6itlo6`%`im!;McB)it$IkQXmCTvG%8qABufG?@_~a#T|!&2@iNT14`$uiQQVf( zVoJc(hm=xzTi*e83AIK3u;MA~Aa&rpD*)Zz8oBS@x4SIl*Xp#JUk_`$nEM88l2uiHU2C@~<6=)?#L5E1CqNu~* z5JN;kFWKf-PuiM&Pn~+@@Vu4F@|JrqTRBf7uOQ14iM;x_7`;{v6O88T?_yjURfp8w z$(Kchn@?Pwo%;Av*SNXJ1V)EY>M!S$k`v&lhyEu!%b!pI4-u_=P;u{-lc#LWekafE zkCaSbz0|hcZyE581p^jR9Y3UNM<&A|p8#KSBu#~I@FMlH0bEsqWL$O7a<)Ps+lfnK zLS*KZRuIm6>6-f@RE3nRtCXn{)6-Ke#-#WdgAQ0QdyMu9rPdO2mO|92!n=U%KqcVB zg{BCVDq>tNkf9V~WY9x)5g@rdHWTUEolyZe0pSF74X^%@q*T+nZ=W9Ba`Ab?ram{)ZRO9UK!HjBqI%3$Mfdl&Y?UmCd6^Xxz2qE!c6(x?vjG_%nBPg2OrN^K# zQ)VxGyrOh&rZh+qVrysIOJfkd8|D0ET0o@4yvn-FfUUD^#mb3;Mh_h_WblCAIq97{ zr6Nr@36S;Lzd=Tc1;ogD4H-A};U&3+H9Pm(C#tf}&<3_PcM=&X{H*ZJxkx!xW_)UPpJ5ZG&s+9HS?$I>FT8sAm8-{( zpE?b;>U6eysMdeFaObmM7W+p^W58a^S1z19V&u39!~1p1OwY(jPY2x86jNf1j`&gu z$>SnLwn80c?mBqflv(qa+bSBi?mPP8wbnnsd#m~7lZ?4E3f0>}%NN(*ij}Iv2d!Pc zWcsL)W5*2dmy@1h&9r8OrXv~?i#rfF>vw=#ugt*zVlZKd|cZ3m8>`QeYh zTAepOIsfvhm(5bG-!deYefi0+1^%ej@X#Y;M~)pms7GdcrZp=hGc%)0swp8_7fGi` ztDNL|JH~@(yTGVb#$=6O>e%`8vFAVd^N+u7Auqf2>ua-+N*|51nzk=L`|=}8s61xK zn9(Ep5*ilP_~FMt-b9288GJzXhb_q2723Y|^!v{@j2t@vi`1n{M)yGzW<2!pv=NBg zyCA}yrLeK-y8&)jc8v_{fA;0$r(S*MYnIT|b{l{wuj1S9o`1M+-^{emUAhh!JAK|` zix$qEHDlZW5g6@(4#21)11PW^(nPW2)sxMqP9A^x)Wx^=y?qDQ##kKg_1s<=8C`Pv zj+pY$!bOigx?sWlhi6TnGPr+_tj^{{gtRnjxc(sQ>`d4}lWryZ5QYZCzqMI+`ozU2 zJd~MpzGc~fe~nDe>NWKK>5r~lv24ks^A}hj4VpK1&LiWJ5~ES^Sgb%w=T`>-BR<-y z^koLfDZtW0D7|EqMSAxj@}cPGnEU6iuogNV8!)hE_T1%5Q1`)S`SO)ZW5TWSJfH-; zs;O=Q6Th34Nze#u+V}RAd4U>L#2H)y1*DeOUVrz)k3apXSr#S<>Pqt6ciFO~YbHxo zTYwB9w5i=pu{G;Yo;`p%TLDvX*k=p*?e(v|{Njs`e_IrwRmq^M@|XE6U7ZH)K!qHj zmB=dEOm$UYx!9Veq>si1L9)Ne(&A|OKeK)A|Jm1X#7NZ=3j__*39xK7gOti?aggF* zN>DX;6q!Cu6|IvfBYhSMxAR*)?tGsAX~0K6KjDiBjVI*&+@{V(+TCJdi;XxYk$pqz z#~*S6mHV+IHo+Ui|NLX#PeDKa{7q)KT1G-+nRU4j1QN`jjhFz;b1F8w9))b&Mh~gf z%lW}-b%^(hS~M|I6wy-Jn!QiF_GpOKrnW`q zX}QQ^jZNjPk#t+TG@neQsj%NT_@#Z|ZU)m+aSU}RGly)=J}1xZ2nz@*3G~E;tjch& zkjbKv;j)dGx>Zv@cFw@?WDDgr`(dbM5M7`Qkc}K~&GMM08I)VKunzAL`Y7viyYC z@l(${R=L!3*>cv)We3%(b9do ztU+@W0;1)s$GoWZvif$*riP%Ct$~oAc&w$;KxDx*x*IpTOqUu4*+Zs5#7{g-I|vie zI%#mXZV=~7RtekQp%Rq}VL$OC?{JwOP43o>j0ItFkW?nOq#A)g(SJ|{%+&rfF21x* zB+Q1TK8x23$8nS%C}narTn#S2MI}&<=ydM24Ocv0KfQ9pTJPLk6kjIaG(gHxa*?@9 z><}{Hy_Y;Pe_qpkuXzjR^xHVVtN)NLQnC{ify!b8f*>U!CM$>uBm6f9a^V}pyu-s_ zt5(p8(=!7?fue(`0zyZn*{t3|+onPsOQk9U`mB1)7pxSGLJ_J&EYRiu`kda=Sn!H` zVxqV0Q+H1U1DR9rW4u8QIRpdU9>i;)GqfPN{>ZQB@>+g?cSUcbs)n=yJ=xNAHOaRXA&z1Na?rjCP0cTdvnla9xui!Fm5R`XRcZ*CU{Wk(iZtrGuk; zqxgO_l^ee#`q87PA$;+W@!m4}e2xq3%p>~fw~Fthg;H^zy)SzI5gKF#uN7x#%mO%- zDLAOqL@HsfD;3RRghGc1g%ZI*AGTBBD(4i(@r^?7q(Kx2mjuGi28)cGZHgCMp%lEv zn+FiQQ6<1wV4gU|vvjm(8d1q5sx(hCygU^$00jbW7ZEEv#vxkd%L*@{k{dleNIy`1 z3fK22mV^MIL8(SHE`*L2n!?k$2NT1lmq76V%0TxRNhoUiNlldIy55)=?P_R_?NBDNvq(ogJRp2Qz6? z&76&l~64%K+Ep)iKkf(jo1nu5To*f8Ij*A_Cx7f?+iy_7+j?BdU*%PE^Xr$vV<-RGLQkVf&a^aX7mv2$eAC(^yPgrWxsk zG@K9U3Oq}xBg6FWm@OBUchSY-Ggm+jAL>b!**P=f<7{F!5V#!Q1vGFTn;#qS+sz|m z_+*-270P>9Sy%Ml!v!)DisMxRNmMSuKc}t3G+WLt?yQToV8}{SAR7{;Z_K9g2pI~r zpbj>kdydw&P&VS%>xV__*@zWHQPfER(^$510p@2;9{3)HRa;xN(+l&%pk6S)|1r(V0Vk4lH183ueQA*)SM6jwxob zHwThGa8>G2;|A_mre4rCZ+ zC2VdqKYzlI))w%n0F#T$u`zDG_>f5#Pb4a4C0jgE<{WWDGb<)zK~X!)yc4cs^k7`~ z3{ilKtuS#utXmXp!k8V<#CsoC^=0+DifG|bR>q9zp@quJVA7~aq>mchNGC58&IgNe zm>^pNAO~onjGzRWz!MMBrlfs*eM+)E zdiVw;-4IG30Rf;9s4N*#L_{2K&=zt-C+zi+>%T0^)O5ME48qKWTj`vX`eKJfJKE-XoOw2N;hmE6eD`g;gW2T`%P)>a~|P{?sm z<{l>FK78Vas~p^W7|2x)j@HCIV`xwj7V!h|5}R%Ty$g6wgcmKzgw_FC52`+wH2o-5 zpJT)m>k8VisTj#zM6#2bOTDaarGOaMG>VVRCLW^iPsrtJ?HxL5_F;e3=k2P1}<>v1v0=yK%fu~er8ir zg2{LUbF-NusMejnpZ$||BB3eP=PnpQV4 z@ef0eVMnNmDgnPaACyc)(Y7NH#uk2MA&RfzGfxPmj(Se)O+=-YzRR=4PCqtlCxVHX z%u$nHV&=842F02Igo)ZXUCO+Zxc1HVkhsJ|QYKTy2^E9Bc}`yres*ZrBPivTqTP7s z*JD7Wz$9UMY=}#b5p`+oAZ7SCDsn3 zilN0YM-YDdP7of~rJ!sh6xly?&0W?nXR@QsX(mN`#1w2a!icA?-)1G6%l^9-fz?Q4 z!>$9ahfHDkD3?OGLeaBD*n&|j{}jn-jYK1UDc$wF$RJ##mr5VzH=N zWe4eBO`D+8P}(#2JRN>Fm6}2il$|;eZK`gBi2Z&{+pv!$Xw z=rm8CVyq_QXqXQ2nh_EEpG_yi9E+PfkkqVGoA9B2K21n=x%Z>jc~9 zDf%cNomh~}-3_Dd$HW>*K#3x%gX9E`B;T+r4+0x=+yJo}n5!@CC1FyO1yq3{LDnj5 zJW*oyEPns4Fkl~QbP!8zF&tsUA*AualJFU}3K!$e4rcHglT$iTp+9^q5J}49=|?e| zC@JYfkq%ION5eGcn5NnOPOCyp-zu!&iERQ2hs2bwJu)n?!GP}Hq$J8~Voj4?2NPHY zRQ?pcz6MZM)J<#?zD!T500X0vrm5%f!M(D9MiH>>C>`-(N(ZP6sO|~os>K9agd$YQ zV<_P7CbnN-B_QI|ed3fcL;7~>VurOAgzZnF@nfp*dBEgrPRs_+V%z|X`&p-$%kB95 zH3TxJkg;)cT;`NVXHOnK9O+UiD0_*SF+u(4VJfu9VXizd*@9tR1Xvms`+$oupzrfh z7P3Ljrr4B8xvLh;nL2UQ;NCfDCSw)GhgEGLyMxYV94ab8X2y(!Aq88)ChXhi2iAV%g9ovMw=3}ms%+Y)_JXtjYo z0*O6bY$KBT9Xej&gRd+}(ftdy)Rp9|L2l54_mAq6M(pDd>x(u*0GiUWGt7xebY9Ij zMNizZ!j7p6JA*O1}; zyCkA)Zh^@s+43P*dap4`_Imju6p5$jUnLJPlYbe&?xOpflvue^)=Ed)oo*Pc76K(`Q{goKDBRKP2S4K=1!kDY7nuH3u=SO0-AOoFmmGbc}sFj z8|s!1PK+|?54e}QRanY*ihA(RE7PMpMKNZw37R(H?azj^88kv*Fms|s_G9r(bw!9DNNpaJGUN_L;2W2eknxH7N2Zqu%(PhL6pF2=9s8qL9vN@Hl-+%t$>#w|cWZ%|CM~QXCyaz@j@O7652&yH$*YNvi z&Re`XAEC*;M_xRM6(>m~Z55t^95lUg=ciX*c`hRsgm?RD?ikO&zG2ZJh;4zW|c%4Yoa}X;X{Wv+lytzF(y}SlW(@j_8#rcEN`uKxT z!Kh0T($WBljDc>z4*;;}&IJn_GH~u0@IwF)Hc3ErKf2!A!{g(lAIH<9Lw!A6eT5Vx z8TbJIOZ@>80}1HiBOMDniO0=;;34$Ueotp$7jFBo z2RYlHX%4^CqugJ%J_zP)K$72ULjHizK>+DfvNJr|1YHN-K;K@D4h4Qh9vbeGqGzL( z0~R>|3^;(AN8)s>U@`^*rb0kwXM%;zZ)y=hNnmaPcvLSxws!cp`?o>8%S!jp@Xy3e zFS4RxWhYJjUAzN|6ENCLaOP&9mwWXm0~pPHB5*JyfFQus0{Nm@n5d{jsQhVyXpv}u z1mi4>JijIutUf&j)TazEF#!I!UkIgxpUA(|B=8gS29!#{9l##O8O9O74$DR91I$F= zZ)(%8{K{~E>GRh^7<}QqeiQ(L1*l9#OzKY(N(v1`9szIuBygmp_<)xhzzk4-eko1& z4_Y9RJo~+^5kLe6$R&OQ@Csns0Cfk(Mn#85LC1s!#zaQJ#s<{`QwVeooLc8$Ob6?H z0MZ=y%cd0YG?MxP*WM)oEkLJ0#`q`@VD%{Fp5lOO^4D@L1*{ASfR&*j z5EO9VL|?<)9eo2`MO{My_cr*tJJ9)KKqpEDlZT0k6`U3SoWWze@oF_@&<@f&qY44ZuIies4uc z{7r{R`@MDQ{jfhV--}VeIK;>fI4FND$m7A-{L)Uqt?oNd1$TY}0&6Ar5`>bDjTLZE z{#tm0f4NsZ{-^h}d#>CUre_6LhXlH3VhjG=1`!LiW+w^JR!e@axm*7VWV6kSU zG09EJN`X#|i%QE%fl11-r2!1tzqENm7QjdY&N&ar!Dv8ovCivI$pi+ z;t}vI`gcR#%C8GqS?@y^fiGX~e*hLs;NZpI?UYLZ*}*p*kZ2zWUIZ!tFcPpZFM)d_ zU}VJsET({f5(RGV1+dIz74>IH`jZWK4t(t|vn}AQyf-+{05HIoV!!|mn6&|G^d$H{ z;1|Hq4Zys=#hGV;B~;14XI07Q!+khFm} z7EVCzWoGXD%{Rh%?;8P}m0(c6x@f=e6zr`5UO;RYfEg?x8-Q=`0MY~W`sKrU1A)xV z$`4c=1+;76TqB@v1LuGdu|Np0f@2v0pujU7sMHFeR{IM-I3@;WV9S(qXG*+N;OfCZdC8{BUmM8HYO&PLAzoCNGdObo0^EGVoDz$f5RRvvmb_7Vt} z`}FYQe~}&@;_n=g&@lHckXY26QyM=m?*2HxxjFx_yZEs&#aW#N>HZ|lU({axJ3am* zr=h_q;i0HBqdUHWa}xa30VGoV+7Ycu1n`tP^B&oqlFA3F(NI0A;j8=&9@ zptAisZtuT>wJgxpWUM?Y7zHpM|F#3%8=^uUkXi$59{|@;`QPIQWIJ#QtdM=nQvgcG z-edf4!2mp=452_(W}xmg@VNV5p#L-zz)7G9(C}+0!>_WP|2hHybV!MMuo?^0WBLC9 z|Ahw75!*J^ie2d=*X%K9+>MYWB;iwZFHx+nJ)Wd3%q|H!Z4 zNdTSb{v%8P1qtj`{y)>N|0BS`ZNVhC0RfK6KPn2KAQ0dDAGJ&VQP{uQ18a>d&>O_x zs)hVL>O(`|4*XR`^M4NPpRNMt;0iQ=`-iv?CwtuK{YOgU{PoEG=yyOp1ik+Mz=wv2_)mfdQ{V~|@qh9l zG=v@?bN}6(|L4R3I==?#{T~SYkun^A-q}C%8IXj3Dx37zTmV1(%e45#s#QcpJfP#<(+bjR*IR5!|U>lU|-;e^x)BkzugRutBz%=q- z(;pfl>^~=X{*qW=ISAw$_zMgG-UoI&{uii!PXWNX{(I@L->`s!sQzya|Cb!D{tFI( z0;2kXmE~X3=|A@kY^i+w7YO_VMV0;?XaVp){Mq~ic_06q!v|&nKtS!!SrBX`|91@R zkM;q;@A)4BKtag-cSO&humcMrncq183Zmu@mz4Wc7ysHP;5k_H8+<4TmVdv#`S-8` zZnkTdUkE@$g#Oou53nGxo8&hRM7nnn|2>TV&F29I_K?8lW=U0}cP40kk0it@|PFJ}||BI}mXAbpZP410BG& zPzdC&z>?^J4q#&!G7GS8=z+ikfG=3oA4K^58ZjUO)m$Eo{qJu8m*j_IKM(*qx$$A) zH-3CL_6Gr=KLR^4ABz3K@E3uNArA-t4zvq|tUM(AAAeTe{J)O}un@oB%=X`h{0ri} zXW~KWe{=q@^MC%({P)oJ-$TovhnBw&{rpJ=>~0TsT!WGyTK`acVEyZ%_0NaazaM)2 z@!;#PhhBd^^!odO?GF!Xe~AOze;(HU^w9RVhqgZg@E_Lx3IXx3_Gf?q4{LvaX#WG? zg?Lc^3jqIN{ZD`q_Cft`00%y_|M6k{uK));u>bji{qFz)9(Ml$z=99D{{pxLA9nu< zFar;~|K@@B9|1G)u=}sT_rM8Y5&e&v!~Vbf&mMUH9oQB9p!*Mjh>?fge+j^U*!`yf z4?gJrTOeNLVfP<{dGJB^UxN{N(EaCN1Riw%J(vd`H2wfU;9=u0?jzS8GX4a37CvnJ z4S>J{#~0s@^MF9r<+q)|8{sQ=lXZ6C&39PK&|G~ij3THuoZg1oCE4B&) zI79W^%-rI)s82}XY4TfZK)C>iLEc9{0Np(Yse;rYxPV{&rvdmg`1t*TU*8~L;2|OZ z=LIr@poV~yaxyn{v3C-pP%w2?Gk2oUF?VvdvbUq)WE14zVB-X7K%m_B0}BHK0SPjI zz!n#mmsk7q7swC-2l8+J3iUUCh5p~a#zWliA|5aSKqRdM5@3?q1`cXn%N0F&6~Yd` z`|(pxX=0vh1iCa&ZyUb#U?=_20(F)xtlwE5dOU}SBgNn$eti!Ih!Z37ee4hUV*{E5 zKcE*>p>-QvVfroyO@qc$?JD$8I~-zkjeB_ z>kh069M@z#xRQ^Gg=%%*7C5a03Sg2sRNX$-tMr`ksyvF{FxZW)A6lZKS5yJ41V`95^zv&)5KWYtxLoRGrpwlDgOMM!;Fb0tt5ldNx#Ep@92 zum38({k@$mnz;lB^_iyk#22_dh?EfP(!KmrWSXGey;txk603~K_Su#qoXo}jp)6)q zq3uS5?=^Cq;SBz)r~a_NJ$eXu~5;QyuSG6P-@KK^Iq4p{X!5SyFMR z%1`EEzOi>J>$-#t^3&o_dKx2mgQ)y2o4bM4DFii z?%7sx-wa5{);CFgXN4AiApSY^SJ$t1K!PTg&jZF1qkO6?g+(By;gBLyXsb$UG}>Qe zu`;ti^K|q_ed%4*uQ10SG%$KCDgbru-s%jM7J zqh(x9jSG|Ws`edFb1|C>$=RtMu_)PuD?GCrpz4>(JMgGV+%txLDrgIHg}RCbJ2(48 zb$YQz_x%8&Vqv;!wBBIsi3C}vw( z--=?-%xGpg8plPB$EmA?4~%!G=Y>2b4^fGdx4N+E#GzYWbQ~;Vd)JhSqV^H*;x6ttYToMOQN6koDKFMkWs$pLYK04B1}>e>(O9ykjt}@9I$xEe6kY2VxGCS`g(| z;q5xPIoBP;9dkSD9Ydl$&um1-It96fYW+&0XU3>{NjP|trdHgc&EKnkR_gKadD074 zR;sA$7O$FN&nqRuW2WEL_CocX*}OUQ=1p!W8uH7#6)TxYCwaclEEAjf$Zt#|uL z60wv=9RlT)5g!|wIwvq?+|w|5yP?b~+51Tl`k$5fmO57v%-JuzQd);XI~?yW&kIo( z6Kdhoo~~tceQ%xi*@^k?B||n66>s5(!k;W}61wpD;9YSOKX<+PRv&hL^Z5kP|LfDx zu#d$pgcC&67QLJr2!b80`D16IZxt~Wx>!>~pmNq4_dFvOu%0=|Y8V$kvV6z-j;OX| zDlVjT(B=AtC+Ux!nUSsjDwt?&$tSPJn2UR>*CcGiEKg?mr(UF5gm>|u`FRdtV4a|J zPmxsZx=h;}2UhgfZV)r!;Y*rddeuX{KTaQ>)w5__t8!|nAtN6qaM9=t>yt2sV}o_@ zZ;W%*e`|j|3Gx>f>()QLp)9U2H6?%@XZ6+BhuzS9OIcQPkcJ-}w+KxbrCOxhvifm` zk8Ygw?R)de6B%!-0rzgyRZYa6DI{gpK+b1}!+s-rhO%r(;+c53RhIMZKt|Vo-eS*E zNa?DtQI>nrihJ2Z&UuwnE@&zSg#%hIbr3)5zx3*)M+#RoAR#tgKYTeWQPdm+>1h+4 zJreBTT&X2R%5p~3W1mhr`s1}cFg`Ba`%rkCC`9m6>G@hn{?TY(Og9nK_-3MIR!?hQC7fXUyev*!}Le%ne z&3TUvBUzI%=zWPIb$Cf*lSW@+0V(5D%|80n0ZJvjBLmJS!wKUZ+Vqy2lzi6MT=BH; zf*uYUb!*6wjRY_mN4uqqudHa;Bx9L{(cleHjt$?wte1J$q(zS(T$YKM_O>>&lR)+z zO3>vUt<0%DAAJgUMrQ(rtdeAA9GmsQ?ka&_<8E3(+iNZ~ZSi-Z(Tgh;|p{R!;r?o3OY7 zfzmIb;;I9ZpOtj4WoRGk&EwHXAYOf;j}Z!kxfDuWZ0S5v>=lE=6y|gm{xaQZhM04i zyyRgO9o+z;UBEk-V4Wl0^oU>zTge)|Y#kr%joh9U@c+1zGs8(DTV2%7nZeafRXTdk zo`IRFuES|rPrM=mjc~{_x~1h8fE5MfL*b2zBa=%xC_db={TOo6DSbaPyrPAFixf|I zw4XjC?}K8W%*hxEu^C3mVG72p62U~C0t;<~LVS&Lar0G;T;Jyh3%8ITwZjT`&bVPY zAXqi{cO5>r5)&-PG7+(cbqkIWATO8Zga^RRKS5tloKn`a)#Agj-j;2;^$i}9Fzp{} zMXRybYTOmkvI~GL^kb`!@_78!Qz7mA!^a#a(*-$WuE!pxswVa}2JPNh3icMS4KWcT zFrUIadF&A#S$jz4t~_2!pXw}|WP1s{m5e!NinY_*_DWlQ=;cT8?xEVxv~YILxN9Iv zBXP94{cmonN34Oq8Mq2E!C#_@7}ieChtkc`yUUV$t=1$>%wIf;V8Dp1Rer9VprP1H zh*5w>&EphGTV@zGDDfyK`y?QceZ1#o*=n2Ph27U2mIf9hejoRNnk)x_@6AoGKUTA@ zYEbwgeiJg(DfORm?5p#(3p|7KB$+Wk5kT+X`bZ-UQjQ_)X))tUX%tTkMQD9tz2oK~ z4Pv^a=nhsp+E(DKIlwDb=GjkE?qV{Da`k0^@bV-?T=ZZN=$A_%*2mHoN%FWPK(fc7 zb$xw4W{@FhYa%yCa8ag{?3@Xr2zUd3*@Abfm(BQ9d5QFsH>W=KQrM@o7vrHI-a5UF z%XmIA+f>S=V7)hHvA2`4InPbH-_H;QW_n2)+whP4Jc~>3_)x8;#XT^|1q&J0wxZkY zS%GEtg@Id@NBfYNMS_NJH#r1K<^t0RUAL7Ce8VT)5k*!$>VH3eln^V?m#j-pV>RGvvou&=> zk=R)C4ZYpSi7Q?+G~B(HXhzO$dzY_Y_LA< z(50&~LW6|VRyq`gpcSTY6r!1G)R2@Vbi+=ti#C&D3vU0 z&Mk6w8cE%Ea|B9740TLX>Yq?w69>IcibvU;z1Ec7O|QmFH6|1JCRQMrqBL7o=AT&D zOlNXd=n|f#>w~SqDVhl#I-%c1)1jtZZ*}&<11)%ZQ8vPkK=G607IC^rb3b!ptrq2o zfB{T|tz2Ir|F=pe7ATM?jh$z9AGwsLl6*vl=5u0E&zs^S%xc(is8Wz|Jbk>D51TQ^ zlSdZ`uXHZwD0GSmapX_pBxbfH@Kwro6$7$y9sw9dvhjCXNlV>+ZjAoksdCfE>b;uu!4dln=fdbuIfN!ohj4|;@)*m?;0j4gsU z%yBx#PYkbjZV%Uk0#{^&WR#D98p}+B_Q_}82ZJ+G%kfpw5tog$(tSc;!<{}?%}_{5 z5|1t8@@{5D{nSyFg#l>3>qF_ztpWFOOOWa_o+3@oBw>v1#z* zI)SgMvD{+Dp9$1guh-y4XZ*{@hSAe5uNo^wqEGwD`*%DjHU0=yPA0KyvxEH%3=NwSaly`dr;pQB^ z((*r-Igc*Uyqx@khLN>bplv@fahRFK{pgbI)QWpDT!C9-u#N83+#nL;wQjJc7y+e8 z1QMO_B<{i6dSZTa|Gvq~qk?7ydE`LT zR$93eYC3*|$}^&Hr~(6maP(uD=rKWo?#4Je({B*Umq(=C>>9Lz$evEcG+ttRHrvG; zsbZ?5h5o|O3Y+n%H7P`^wK-3Ep?8vqWu%J>QxGei(-0?Hyk(gtGF^6n8A<&XqjOxF zG&TMuC3Ct*l6cf3+u2&!3!uJz4z;=at6tT{^+Dqgm5V)^aG{qdh;OT$SlAZYA4NUq zm9X;DIy(MI)R!EgY{j;lmaa!iOWmS$YYfQah|NB_b$XwA_b0M3UbT%(F6g`@?FF)j ze41ubZ@77jLNd#>OGg&y)x%U6d|wuu#MP=uwfoG;JN$4H8un6YThC_TbcPwUCeRCY zqiuc{W}r`vRqR;aW{My3yb|Tf&sT36D3CmSa0_OUr#wA;jA7^NBllqlZ$5N~ws`h< zP2X<&pxZNS4s_$$54vzdK&BnekW*rAj9p63VsGv`Lw?Wqe!Q)^WTp zzr|=R8#4S@Bh|OBojy5ugZHXS=0zqffy>#QEoO6#pIpOgheQd}X|xG-sxsPqb5Uus z%zAuou&&2&vHZ=?3mx_Vy@XctE^=K(hq>|5F+>|oMT_UGY~IqZP>B`h3kpb!SwXzD z4PSbf$HLuK3s9k@y2a6@BZY(nyjEHiIkMx$>0q9V@Q)>NGBp_WTJ**?fjsFo6ojDMdJ{)o2 z9n=6nITP#Yd+OLk3D4|OyWmxm#mz1zxZVN3h?@QwI&{b5M$tr^8C6ulJMODf`!WWK z5a^#_-KP%PweIUZSdlUH=95+*I0_@kuRo7thbm;I&!R?nMcuWRAcN>H7@X6 zW{%fMb}%~E4|ywn961#IY1Csjq-YTd_m8>G2-HPV_2!l0sWVB%Uxk(Rpk5Z%SZW-> zJ88#Auf9*dWurvwQmDQN8+82~=l`>-!JFr}m_X0K~<$=y<|gU5`o&!_IvFenBjddx4L@`s5%*JK`e-Frn_u? z;s-UF?~IPDfRqpS&1F2S5|8f!{2T0~l1UH)qj0SbNsWh!$ZLqI*OLVaPAN-rsZAo( z{U}+)iKw7 z(xlLC?xEzcb7*)5Hrno6vW9B=(~TdNVoG?(0+1iap7Wr*Fs&fpYO!zgZil-W(I|jH zu{u$mHMGFqG=cxx7n-I8SI=WSa~uun;!*#I7?wLZ0HTI0ASY?%MbJ7;#azp>(*?+H zvjt_1mE_x+4PKe+K8&PGH164yh8$`JwR6+6FTFB8U*z}fUYmam@UjkpTO2pU^jt-+ z<{hwzEvFUi`JAwPo={U*dhu?+2BZ;KC6(=swqKb40%;2d?J)U=pbhrbm!$JBTYcAV zq9?|#uJQ`g$ydTRU#?jl%0;A>t#f8hH)V(>aspoF^&T7bQVMq3hOvJ-aj7%V_+t5X zLLYaTR@|8?Xqd^Eiav6tdp#^cc>#GAC-=N}a?t&vSK2M&>4ik@*J{e>Id7gl!$TW9O$B7_2 zNr=Xa>A?!~$sY%aWKi~nU>?GTN~&X7x`b68)zW9bX2J%{A^~FM#DkjXgtwL;%q_a% zBI()jZG^8^NUtwfH2feQ6MhCvWxJ?vg2dnBUF_vX(0K2cXJ;KR#VE`L^R`zDJ1ZtY`DH(;4>@wJ8}|g7HBvQVl}RDJKUaljsBN!uURwVjbjO^BQdXsH&)FRx}< zR1U0+n01~{A0K>5#13O@92{THP&VO0@%33h=jx|mgL25ai^D#A4adQHr8~(%Sw5EL0MWFR#>1`NU=WIpJ2ASm<>*t}Et$ zvf0U___M81j_u_SG*0I3R@C^qS@^V+mC<$_`l0PHvjs+s=PlJ{o=MRL25?NNl4rIV zes98NKMfPMlrvo;jK95U9E}^ou zZaOtg-wWlFDK9ghUtND|qM<_pjbpw_Us-Z%)=#3Ytx0TC=fZFiO`?xONSGAyA9h-| zgTBRLUU0oXU?-f&ip%Z%4m%J+!zwtDM@OYs&0x7U>n9Fb+;~URw2ifC!tx`jiY^$z z3=fX|5a+~ZJY%yxuq>&JoNafaCYqczG<-k(%F#c&p>T(N_r?Z$fob|Oun$*x=!dgK z_hkVs3XA@+O>FdJ?1K2RDvcZzMw2)EiQd=HlN;U@WO3%^6Vy;nv_!&4-C(HQO2OQT zsbIOG=51#u7IbtREh$u)4?9J&=2k12KInkeOH`R@_B}sY7`bImrCGeo%@``lc`AYR z6;fT}rjyg~oo&n-dbW@I-J}-$6RB3w#0zbjna@4P_CrzSI7r$Rg@xKaX<9n`&%Q?a z`EGQod_Jvy3KA`Y%eX8HD_F+V?)l!W*s1Dd6mC9^0PSMr*^WKc=jtmP_Sv(_mR z0$Dyberom$E6rwujg@l{0pXzGxH~l%7LMytA zbImiwzjl~1-}~8R{tjo}+IGE1f@*Vh*;qq4Lk(W&ZKzj^$wsF2zNZ0R&I!Kjl!Mx+ z7<6NfxZm`ZxWjaxOb&`5PrG{ligX<$4W|PL!;23p;MFjc#SSZ+0$)sp{f8 zcW)BVZefXE^vc&-=1+*Z9qG%u2C4|YVVO1G)expafroN1GTLeIr_W0Y#v8F0mKC>1 z+pZ>+hb$@8{5kye30=)%jTT*hRxC|k8@e_=qOw~sDjRY!w?cJ{1RMR9Xe8Fe$#}01 z%$5O1CeCN?w^*Gcn;VL(TDi4~ZGpHdiUF+*a3E%*6UBpf*kdC z)~`eybBIDer!7>7?UQfvgPX25jkL9p^-1Cp=2&E0TjXMgrWYNHemeak-(?|O!ozH* zx$$S4OKx7RztDV*+NOKy_nkn-W1Q|FyKn9BFUynBiMU9n;ClABCpC+_Nk28&57iZl z?|Ib7^|%*bZXruhhJJpYuC9oHYI{BU#RFMkZ%Np1Tc<5dL}?dVEWnK$w?gX8w-?X! z`f(TMBPe!cnC+o$pCa{+RCeyEqOJ{KO}L|2Y!u7O4lrukDRgy}N>+i8_tN588lxa2 zUio5a{Gb{{_9s8hFUr$DN2FeRVRPXS2wOCND3n_MEg7KMuQn0yj=224448zeKy!v^C7cG>K4+( zG4FURupaxvnTfRQNAkaYU%0`)`tC7}#q61fH@moMDl2jR`x4T@KGyc9&tp&`!wGWi zgJiH6j3zu)j!lk*1Sp=|M8djA)ZwLGUy0TS(K?=<=;b_(dBfX1v6Gig!pa7wi ze@8hee zBuDyw-Z0Sgp~$}ps--cPG08^ymgd-=h0EEv)QH{VLPE9z;#!5Kp=ahmq@S^Q=WKDj z->G{&&&h;>R5~g!5#(W{RyJzw)tyt4*hcbyBtOLI+ohgu94efDMegjsdu8;uIYw5)z(k_@l z9IxCR8UKsUE|1(!>jaK!h0}RY{N+6K{n*uab0!(%97Ir)W=FvdJ2B9-vS-dRd>L>%ARiK$^hWQ7d)37Q<6RW%*4;uA-C+1ctO7&*R4w9>i?oZp z((0C3vh?9%FCw-Y*E%0mjPPS5UmSPdQK7|%LHfeLyE+69gIC8DcrClCZhJ2~GM1XW zy=1U2M?=THNXIOleQ{lF9{X6arInN;!oNAaR5L9aN2J!Sx{C)LJy;jFlA#*&czm$e z*a0LO_JuS1L|wbMHUDYXqh$5Ug~hCD&tmFridJ3;ZNiCQRqjvGRp`kbh;; zhf@FMOe$mJb}9OvqJ49I%%`olxA@b%PGX6~np5Lsr@71Q_8qbT^*F{B)$5aES)rBV zGK}S|M<_|Ah@GrOCJf)vJ;Qikim{)4k=C_T6B9u?X8&HQjXc`JjiF#hJ!GFbFtyCG zZjznALwmd+1;r>5(uSDxW=E|Ff0!y%x^dx0Al+1*G?mG)#}3sor9p*>vEiL}np`U5 z`ySNlk1_!-Nlt9i3UV2ushpL}V|xl6UQHB1rZ5$)Ly=~ReO!+?Vw`kW-Whk`u;NbYW6kD7emruij_ znApTZ?}9<@fR;jIq^PqZiItaX3%88={fxL0{*DALEh+gI{htE9XkS4P}c;8b+L!L7wZRATy5Ek#C z&+WPxv#i&8$l<>vn>&*ZJ-uB>kV|INs)3Gepqk7W*yCXJBeD2msol_1RiU@IsPAvW z?7-!M1VUk1PfkR3XZTd&NIcKI3!e~wW%Wq?U9qw2w5lgV5@s%wFM%OlEoa9gE~d4y zJW8l9s7kUehw#-$&H_)T5v`mFN4$^)FJZkHy`!|>^IFV!xsk`i=u+@`lIG;0$}4KT zQE->SBB5Fm$V46AqKVj)XiR*P8# zLvAX!#)1$mLyx?}Ph^eAp(R5vYdiK*@n6A13KC8}M##Y1b{*OF97Y%Nf8|iL+ZOai zN2o2>MJe)1r@_0Ep>J9duf{d~2R=?T^`41VJ)CYlVGhGb;TJ>@AXmgqA|a@E@msP_ zyflQ+krlY3h;y|H4cY^~i(H#z)g}#gEtTHooR4XxEGRnq@QxqOfblb!ztEP6BB1pk(3qbAl zG9>jlT7P!LXj2W3{raNRFR{6#XUjr#Ea`Qj@P|wL)ELCNy0{&gq|O#c@_n zw90ue5nM$TrezbTwa4=cMyaN{W1T%=o>u+owKRi<7{+$xtZB#JbpnSHi4Zbgm{gGT zbQh)Ojml5gQx9klUM!&3h}UC&TCCnF##oJC;aSF)5P2B(VsrpTo>n+;B$@l$S~GVv-@2}`|YC=dIT)2daj!z zA-B-VlH!>$^aPi*9*_>|EK*}rBsUj1QG9@ap+F~ICi(dAi)+-!Erri+ES8!n1S^w> z9PEkgK9Xs*nI+Qge>QqnoTr8_hT8^{5^C+3o@mhA+ji3PvRck0_RZ`_XLW}Elz8zi zDY1iTOgPc9sT*2axIE{!Xl!&OE4%*SOj`M)=M0J8@L$`QJqvCyhI=n-p7wo=B%u}R zg~5h3XKaS`7Ah@SB=Isr`O7sXLl>2=WoI0$c3A-%!ZSow!Hbo5+12@6yGeX3Gj0cp zo!u9Yqu7-mBgR+C{SUyFgIU{p%{h*wPNy-r(F0SJD=ou3GbE~q1k7YMyC#QPc0ScqccDw1lA3d zmxnUf8+32JhB5n;I_7w#+k~j}Y~j6-K)XF!G5G?Y`Xybllp>4YD3q;azV>()_khZ6 zzscryQDN+p>y?qt$QIGL-IBF{UB)i8h)q$4N99))N1b}y;wkz`KM&$;z96p?8@|k6 zuR?r#d^WRAq{aQ3OEEgagyoLQjI>0PpxR%FQ8|UL9^Ul*b@H*QZ<#$(<-{v&dDe+b z5DY&Q!n1TgI_KhdZIt0hmt17)y7c;G4s`g{R9y()P)&$lXycErm{l|*p<6&}iUiX& zyXW!!6xO0c#H|5o|I}Y*zy)f>wm@9f43vm@! zw;yV`*Dk?xnzl#0;e3SDOc8yG_niH3$hAef_QovFg6f^pT$(C1Lt!1URZ$@er|)tP z>2-#Msff3bQKVqzRf)MBkzn=g6T#yP*UyU}oP83eKtgtz_ptd!b$6_je1xK$6Rp$^ z_IWyw*C3sDL-6>FUXVJF(>J?0oet6s40TAJl={&%tT?!SP@eV1rQ$VnNF(jv>!8Bs zZhQBrif$~d+2kcDtQ~BE@{Qc2e%0<2OgcH%A?oD1!24Ypy4?7;h&yrwf_C$r7Ub33 zHakB&zFTvoD55;)eSGRoJ6zL?4%-(tWo=y0GBTX&2%=_|--dB_8iuZASST<!(rFG4^BWbwBfp72&FNF0V`Ve->2Mnr7MO#r0&r0k>eBq_<-%VUbY01>Vg@jT3v@D>`F7^id+2?5d?Qh|; zcJ{bs9R9fJee7av+gP?pUO%O;q+ob?TKiPoKYZoWsU*PAftA{OS^R9L_e7iNafd~M zU2N=F3I6mQV?+){eCy-UqZzZAU_+l*zT9f~YW(FyZ=Du$NPc!fMIuo#v;Ba0ucsC7 ze_=P$(_nvRL}tE!@Dj6tr{O!-`|}@dvv1i#Vuys3dxJaLzO_P8zcggs(T|)PBL48{ zg~uRy?Cccp0u%cD&+^=@+=AfUjhC*3>=wnf)ZgM(6cai%;{^Fia$%(h`EK!5?%EIO zJWO9}t+7d37$gNHnIH%e)a8{XQ0MckJ)XdRbCgCh?7C$Bf5Tk~w* z-VRb?s-33l4o{nqSu>m{9AB?ju*UCdX^$;K#w;5V*4zr$w0QWx?W+2+#e* zETzBUK?_+XAFJ1e5vVC-|}GEF>ONylr@-4farI&eMv{D$aK3mU|K-^C&PQFBDQr%&x6WFF8R>CU3kY z;*!m1qOa7DC3nen=apH#G=jMjjE$`tUCCo*m>B}-P zs6YMWih=%Az-_n7iP8j1t1e3pR{Uopc?QhYj0>E1!BRgPi{2VeE^LeEhFDvUV$dhr z1+CEI6Be(!oFE*hqgfYso}w$OQJ5-5m>rtt3=%tu*7{snDvL^U$37K2+hV7Z;CPi= zxg%!bz3B^T&Gc+@dArmtWRVoLtr2p=1UXz;Uw`aY;!#YToPL^3WYKdg85BNq&GxUa z*48L@h$I_=afOCKJg)EzUW^^tc5Ta0v;owgyDzTQH$EK^N ziWO%EAk;AKZEnYRgB(RNO$qlqaB46nbY4b;7mzEo?XpZ_^M9&<Yq4}%2UBOHa0ls1>)=8G2GKu=Zp{C?`=+ssoq2I@8N zL~2e)_H^>YZ%8s3=tW%fAOeF9v;pwZwhguZYiD&p~zp_t2!9lXz;SplEhmBqm0ut?l?krx$h8z zSeO3iVX|=Kbdj+2A+6x~O2KtFi&c5HhI6ieEjE;H4Dq^WH)4L7bn&=k+H{*A+ORY( zD(*!ywuDB*VThZEqY@kK-Bp+x8G@n*^KC&Vf&^>_BYju<3AVg9|C4Yiv;0W)_{W5V z39oJMno2Lt#)X(npKR)W#P~i(`zpMeD0!AMfIxDv`knwQ~f59gv{y1YP*`E#ale#m-^Vw2`<3=|hWQAQ~@yMEusQC7Hyb`-- z?)~$RH#gb?Qh(lVM9>teX=TJsKqVSe)rx9|#f^_+db-i#bR!DARkQ1?dZ~n4ma)WP zj;&X9mTP{nLCntJfEH^vexA7*dF!_Rq9&iMepq{JbVYU`zc|UNL56EfI;_L|(JK^d zp1lU>YK8$+MGH?wFQi8#0dC2eLIz{1XWsl1`85Y95uA!c2U6K4HMGnq*^rr9SM>Wj zQ(rq;8aGq8@~EVaZi)ikCaCC7^S2PxrOQ$HN=)T%(R|&(GL>@s_*$T#MJl?PbM#D8tod#cwEFid`OffUVvf}_dAL(0! zgzA+)V>RqcwN94H*D%WRa3W~zHX zYs=<+UGw{P6)pURg!*c3?=?s&{rSPS&*YI=#7`vLotgXIQi*!V0UJ4Rs%-EYjjcp# z_}1LoH_Q5W5{N&+&aq1s^_rTuJqk4x5Pe=_kGeow*DARcqH(Iv-uYq{cBnmlwe|^f ztw4RJz2kXOwG@-~QebuYtDr z4vjkt2A;n-+9&LYMOFS%U9IzM+(IJS)OnYrS-0iPM-#fG`Q!ouY~TpG*@Y4H(Bsj$t9w_oPr8?;97!J)(5|h zVr(jEBq1yCrgnt<_>|j8&r}JBx$>|wmcczcAw98hZh6K&_K>1!j^TTa_S_W^x;r_* zDXRS>zbww8!aOm6DjaoaRT(=%#~?!2e~zPx3n;4S=OlOIhS{W1F49OCrjh8$6`>UzR5ql}gH%XiXyvxNsz6)HCON7~ z!x1}hvhwDh9S-t(l=cLo1OTk&!7U&(S|7g6A1qZ5Y5RMi_g{AdO5t{ci=XkP)C?7% zluKl;MPBDmDit#Y%Q7hO)EfD#NLmYIVLA=bb@M~>y^tqtLU*x~^lL#YZCc(FV{*yD zb(%~GEybdSaeRR!ad+veOr<%Cd`n@GALfRp15E!YM#v5p%?9d!eSjPNB;!KTlGxH{ z*47p-+dFgyUhJOGzj5Dtu>)+_mv2E1V`3KQ3U`t5#iR55K;N13Fd7ph1MF>-Ha(MI zgpA{!QL?Z|EF@Exp_}es+u*)LJqXcZBwdW&QDBz#Rp?lj6Nb$$?R|k35#@sr%efp; z8ng9zfI?|9z$-?(@ho0%d^Apv-=Ctq{5>}#@btRt;|3v2xk*wMO#m*(0LkB9khh>r zgKQX1uw{b~dw22pf|NlQhC-PP?5pAX){%F6vAgI*(3RN~%W;$T*{9gBZTF5*aZlXN z9;1=2xyUrN3VzVe!K^MSU57m5w%|OEfKpgC{g5-!pGe?h%$T?d?W1E_o1V*FYAFyh z0EqmL6G%>lQ`mbjz6!A-Sw9#octFZ?3uEozVmnm$$ZO&nF&%Z7>x=Uc#Z<}>;=&wv zqWb?bK+tm+cdzD?Hr%kGGyi^6zUv9B5acU*n;j<_$4FdT*((AU{~G^wAq*LgL+}ta zNe~l0e)+~4NRuKGNotT&*~J!At7UZ~)DRltng^e{IpQE9lY@DbMmQleB-fp)L_tNJ zhj^Ou{#n<)y9lToFc3KLm+&O#1?oZ+iK(lu=KokV@UJlv959&^)gg~ZEALL9s1+RN zcs&??{KNUJI;CrLOhE2lgKZbr;n-~#)#||vTbnePb6Q}A?##54Tfh}#L(eo-``R&k zVIZT6w44x@8Cfr?k(xl#>}un+^V7JHxzT-abhcoFfFnFCLS+I@0;&S^DZPbd~hjgzYJik)_r^1Bu>77vWXZZCu{43OQ zhs)-7^TILj6>MOgXbzFag>XRat}KDPTb`wAEf>(7wI{0G`SSezQ+`<-ZnHcRL5?;da5?JiW6OK% zApfQ@XtaH3WW$wT8I=V3(_W|&$J1FO$^(ybhum6p5O%tSbN?8CG8iCV;UdhO8`=4xektB%KjvMnlT^>% zR}9SNDf%3!q|G_(3^Lqp)%O$js{YAsuKhH?!k&G2y2=;oo$3md%Ik_3+ugIS6UBWn zP-2TzPQCp|aFoZ_fvAxgKn;EVH0wXe@trwkj#ZM+V znSTvZ`>PjurDVst_l5xQDOS8f+rw8_T&gATN@_b#Z@b6B4xFHVjd4tRXy3&=q?@-0 zZ)rCseAi3c1lihrX-JCIg)BxBxULuwc*R|nYu(`JXJHWbR^hR*Dd}w_Jp}g|g|`vE zR$j11b}gO})o`d8pH5%Uo+qW0*1}P1ROx%`Z!~0p0xmnm|+&PtqGY&O#b2MOj2c?yRs{p;L08$OZDi zBPn1d5eKj^(-H&*QEy1w2lOOMJ8dLoelxc4DL{b=-@tfVHIMgl&0fCAH7y0o9v@|w z!`e0HC|}d6m0v*36Q8bJTiMMWeDD z!w$_OIK%g63Kd941T)u?>HlZ&q&4XJz&_NoZ<*CB+77%fZvf%Wc$)%L3PV)Ld`Z6T zbDJ*;?^f`wLc}8XND^@2%J96gGeaz%RytPv#<9T1p{p|HvO(JehnxB?zF~1}yUF}% z%5?U1U=I_Hdxg6>F$U2dFu3$r{;;hd3si^xMN3HfHFyYN9wd}B^ahy0`qgPWu(Uk= zLv1+t-%zo5T$53u^}|2vowX{oIxhFc7DR>VxS5Xv`#%fW2kf))qdz!roPeF2+_BHe zJTbwF;R!sX6+%w$@T;}W;28Bv4o5EX=211c8Z*L!JMntHS;SS_zmY@xZU7GZ~XsQjbs0QgW|k*QNr7Xk7e<7vHkxE&_Ip~TPv>-UqM{- z?dtwBs(n*9O>fAl&Wo1g5&Ll88_RJzld3YQIr13+zC1TMdnzapq7q>nb0IaWIcI@A zL#b}2G)ymnHop(^bK^7W-QJtBMnBCw8|?wOe*3~k9E-B^#DaW4rKs<6oM5EwGwN1(n+}t@(*cmA*ofCp^U{XLS@SY1Rmw;eAEW8NI=T*}>)64XI@6)cRB)!rdw(;F{R z5>=2gbn3p!!OvqJ03DHxYyf92&Z*p22?6OuSyiBNNSyV-1ShOMj<9z4c<3#WRzC`C zcA)}6KIa1g-nR-kg_}b3hDdVb*jKn5-8)eAa;!$xHp5krGKhvy#B)VureLTtE@;Am z+Ysh!+~GAhL46js8?#cI3^z9AK(ygB8U%-0(|0E(Id|slRmyi7%U={s1o^i=#mA?S zWqy7PK{jzXS<nO=|8l}}4|7Pfe>f5eI1THYTxE#;W*BTU!HIkH7dYj{71 z3mq%h^>4c%7Em~|=nPb;X6IVD2^i&5S~rcq6zr-{$GA$h%y7VxM_x{cPipCXWv9U8PIG&7@K43mVk0a$?cmznun7JLB4SV1yDLTqSbQ8COzv)9ah1Bpa|Q z9cdha%{8J#nyAoXd{A0lDeeOX1$ic;olkA2RT^eqy!~Y8w^(-_Wy8QOX@6ZhiUq*V zxmsO)KK8)p#952s#fO>Q!jh+ z{WH1?o2S^fjkiO}W) zGJgWgmf|Z2DFYpEWK$FrVm$}FtHIyYhkBt&p;ny}h@EmC4_I=1WPiSu%{S)L1-$bf zx;9%l(r@3eUFZ|o^DX^vCS;I&QKR)AZ3RKlQcK?0RrMYz7#q@1l|Z2Ort>!OBc>}| z7Ty>ahD$HNTj{rBMJM|7mL5po&s+Ox{)*q}k*(^Ls%ljMyy+-9U?m%bE z$=r{WTZo*{ci-8lU$SkXeQP9@)uTp0tEvI$gEGa9=pSZ0ZJYbtvf@vuDA-j#Nd5tl z^ZAFJiAEGhWzJ>GkkF)`*RBV%AofoN1&@(EabZm!+#bg(8&9P3%+VHfk z{jP@87V!b4aLnG~TmXzG<;Sdp&MP3WjQ87+sLN?Ydzut-%2+6qtP+xQ9p`%!rFJzK zwDdKA;)aHHe%-R|PL(``9GexG9|C)A2T34KS;+1;^4H45N=F*k@XsI3YkPk<9-vq{ zOFZ5DF=yT(WGi+>RH~HlG(Cp6%+?rcz04?!J|u#_uuBS*^qIf!l`c3kgt&81NEr`W|Olw9)G!UvUr z@Q7J*9@HczYAeK2zI#jYGZ3z&=a65lv!_F(Wj}hRZASx;6fnHhV6gj^kBBUO&PU7# z0_cA|rIkZr7Wo|>j7j6RDl5waFwKO?#g4y~-_{#Qvbt>BgnNqxwMLqt)`MicDc(|46Y`@3 zTg$79>5Nfp-=6tjp7=-MzM$|5%_t^A?$&crY!mYVWQ$KOty6l{)Y|;6Nfuas5pNsI z`hC6A3WYFjZKyrvP1n#kQ#!&Z0u3*H8(disAr5(ZDrSx@F$AUTUXX_>OS8q_t~DC% zEb2CPX|GzO#T_nYAcYPPZh7?e^$2fjS+b{8+yHFqdDbXGCV&Pk|)F$~gU z&D(5x8awtj+;rrqTDw0a<8wVbQQdMg6ZEcQbCryD+3kO2CbOClXdx=O`86!Mca&-T^dcB`^$;LE=C6Jc5IIxz1vAzbGV^ zCaETPQ+u(Nr<<;~S*>;)@+I^qTXxN9<>Ha3z1S>-mz4p8WKK@L<>Cib&CM>T;EoEz z!7AA81Wnj6I29_5$mRSeC9H5J)ceB>URvdAHOBk$1fbTJw6o6;7t(qBkj@fpnxu&Z zr=i4TSrKl@0LmExos1$kcZZKL=>X>b zK9^ge)`4vZmdovS%zDKqJXp{c~ERx_Wx5mODaSE5r>?*eqkMDxPv2Z-D6Bio?;Q zlk^~ukt~E)$L5YXJ*h@bF?DGe!Lwxk@-9|E$zAvLcb{WnMf(pPA(K*>$=r>4uOav6 z8Rpj4+*M57c>%4KOUO|ur)I_r&)c@;V+`- zcZdt+w>LfMSFXvb#gC^>CrD)4U#h${Jwa!ZH#>3OkR}K2y2c(sfZhtFZfFZFKqy5V zI31nDpL|W5fDSuVmon=)K$XTU*9HJz=~E>B%vq#qny$3=?ec6BJiryAQ^U~y=D)2W z@uA(W)XiZxPkvn@$e&la)TCBvzFvqtAdOt^rn+e~FC_Vlc1RbsXE}8UWSSZD34zCNRB)4uuK@Y!&0r2EAq!!Lu5PAi$G%fo>Ayrp=tDSg9+CaU*O^c z$!If4c?z1M?IOW>3exN?8aOu0ogrnQx@oPQp);!(@P2Q0`rubHuVI^9GKwUDpr#AB z6m}O2*SS&C;8F(WA?P}S#VHU<3ET*TpRij4OToFNjYlCoF$>j7A)Y+ME`koXLNwh_ zQvQzGR-{q@ykqW)Su48hrTeCurO|y@ij*=3FQll`xgltAQ^LJly(m(#M?P}(pqH++ z5u|dt09C37rdGZQiCamUYZ$@(7$JvB>~iy%ulTdg}u<8*x@pzchK?Oa;`r)pGpc;cRo;b$42a;Uw-}+o8P^s_zp4J zvqvzdo4d+a4@K@mwXQq6Fa52Y?NshL;q}xDb`nMU#+w`KO5VGKZ;6uZ*L}X;qDDrC zuPnxeEl8CNVedhQt|d;tB_$pCgmB^*Y+2ssc4wY3bS-nnGW@MuKtWf?xX zRsM^b$<~*4D@JVL%KJiB+%sysDpDYKMGl}^M0eT3XbJ!qpahZ-ph$JD;~%+bB|~66 zp$jfXU)iH*v*yp2^RW- z2ewixkLU2}Klpk$-){AP4u^94dc6J~o&RCc=kV&oAH%AD;pvVS&agdqr#S6 zr<%&3PfNJhLIg1;q`VCUUGA$6l?sv&ZSq-r?%iHQ)J!??HhI>Qw?0oDydm07>CtSR zQFS$ENmVU_PLsr4{`mk*RSvz;w1nO(_YvYV|J6H7M{7HFW6A zph}&R+kaj)3qCT#X9&n9@!D-6Irs5zmq_w0N;RFVFs_Y^Dc6BvoW4(z7L4Gi)h*#P zFDy#ni+IxX?x7tY1m4e-D(|><5nJaF(mRI~Rb%d0)9reK@ru?IP3ZCxABMxZ0G?C_ zSS|4XZNkt>VP&1^eVuy@ar?i5lgZKOE+Q4H;t6Ryx5wzE({1h;)DQQluyBJOTw16T z(fkyeoXb(9D5dr(LKQg%XB=J{W@etp`kAZm0`W&g9Wv?&g0|m(MJl?qNguc__~j%^ z9?5d_MzP}8%}z1ujB(dwes3&t8%4sVM78KY7E!9)u_1T+ZNh_O;u$jGqseGLO%|SK z2+h%qRII>raEI)TwGOCKD#h*oRe0&6_r!ap6;QNj?uqQ{r_ALOgr{0=CBU&0FKA8} zN%Yn8Om`u4Kk9o`08U;2{uuc@>g2AXZmiyu6nn~b?zxVD&XfA0+Z24X^u)YyM98Ln zyjbo6{g~{QhaCJy#HBe~<#Cfn5|oY}c=FGMb*c#N0~kePWpiEXgHkeWko|ihqmC-7YCj9?#JD#WqmWgJ++e4&FxfX84boP~ zhl7Sv%#GO}q>r{1JAzszrlRb<<4^+R`?GbC4x2Lf9j;J~En6Net!a%)WR`QBBTu-&8SwB@D1pXi-GHS;(i{IT?O$PmxPLus1aK&txqu7*iEyfJa=${h;>j%}d8_NQZ~JsWF>#m&uUoK;4lk=H5yc ztaSdTTNz83(;5gCjZG0?yOX{!Ph1-uUt49qF$9!M^J$*a|3p_iSOv5GZDYMP1SSU| z{4<((TJib2S8e!dzhJrGn*xrN(6yJIl3(0zlRr`FI*>NW^!pwZam+gJ^z5|`!?-3P z4X%}hD&(%Vo3e^8S8?^9WIigo`EUC^0FLd2=i!5h-m4Q?Y|kMLj3;b$wp!8N#XnPg zv#1?y`nQHHZ%s!kIXt&uYngqvK{z9{MsPF)3zGjX@40XDP2r^$BFg8!3l%yj+i9i? zc+85>7{1EG0I(5nqicq}*t4w(Ja+4mDx3>C#F|&w;u2GYKZJ`ar)ia!#I>E3{Inb5 z_t)nb{o#OJZ#!It5ARSjpmbtmm-OB;j*&b%C~uAD1$MB*{rm+WhkQ(c(&QA&mOy}@ zievvY0n?|ik-#&VAF{1JJoU`0TgEq9#6ah4?*tZ5JB+RqvjR0QG)!6xFaJg@Lr(}5 zxXx!;JkZv^H%4^|2Xl;bp$>|H+2uvnOlYw_&t+e5^@dPYiZF}*zT^7L_JpP34oLh< z(f6)b|3{cj<>X-)3A%`SUAp~ez2t!{wuMiT@m3F!=*S@X*k(8mqwCUO>SuQr!{QUc zMYVt?KbZ=R4EY%yf3@i3*y1_(B^2$3%uN}#)bOQHik59XlH?1MQV2;Ezx*9w5vc=p zBq|RNGCp*Nu^i<7+FnWA!i5E7I5{VhfzV1@To>Et-6ImCr_h5!!hnC432 z=^Pf5CnK&~X7Q~GZnq02qi01_R_%)yK+4kesT+R2&2NP*$G3))>gw%HQV$QC`oG+c zpWjklPL~{C76@-KZ~uNTWncJ#4^eWVxNlM>B{tkAS_lUR`xX`?H{Tqa=RIR08WK3X zw;yZRD*G!&$hHTMl&QW+f9_EOlQfsBtD2A&N`ooQWKni*Yy-E#Vsnf5a~C5hnbeU< zH<4MSDqkKt>B}@wqWy^j;$E`L%8`lA{=c>fw&$A0iRjZ`roz&+K?=BWH#`(wq1O&g zuBP0f5_xJO+h2a*<&Ct8cUs-n_CkLDFQ@qoMzv+Hu}QiaEfx{IxNxO19B&U9$aV0ekvgrkMHIANne_e!f^$I1-vVBQn7-=b^1B+p$0`CD^^kh!x})MU*#;v#}rF)k*z{ zG!%W;FUl7*M7jz`#o&n&=GVCkrwXvK0{QQ)aq6NEJS-Ata9RkX4JP|SP5X^{>dv4c zfe<)7$=GiXN87THt5vKlUQ#Tj{p#h{inVoNR5B!P#E6@oG~ zTaBzktC}aq%Hje6D=)PpHe0HT?8YaI@^MgTL|=e`;fmq>^apX`IemC_L*DpBXq%~S z!g_MuY6$Gl;^U|>*uL59UY{2SAK36g=1f*{44*0lZ&49RNl~+n? zavtl2{@(32d~B+L^9CZx3pdZM`?rPRHg*G!hpBB~?24B|>0dOsMN6JU#p9V^f)MHmG+JL_GVJi{cP@#6aBJ0A5V#S z-biZR?31oFXCR^NF8V)5WxJepOb&5ZiIDyIPN|P21xeopn#W zcyKs)&ePc#l&;(Y0>8)qHu_1ktuJP)tydpMK3(! zR}#OzD4)3JP*{`dZ}@v5FhXo72&WYxJ++r_@rpExT~9&{3Fvt<&UC%u?hH10{0Aj}EymXvt5 z8Uk%*enOtsSf_&ATD{9#FM3yEx#8`m<@5R33XZk8CGiExRi${yGu>f6C&xY3;HTtu zFo;ym6r6u5>vXNGwg&4nc2r4hYL4s!AOV_pTxgCS z3w;itQ`TZKu~Tg|k{B3f2$?J0AYj1PkMUX>hocOPXLOcf8U*yMIHq^;-B)6u&1sybPy?&U|`4%AhX|py4yd#|bvLuH@fk!s@Z*EwN=;s z-$N!ecC0w>v&R+R^}4eLK~NSLp!@?Ja5U90t)1M8prYqsfX;PHsaidFreiOEuxw-w zeD9erk7P;)_f~(f3v=0BoGya@ghp8fxW`Md0y96QD@n1J^%|lA zL;x)XPMsI0pll}e*#Avjiu_?Lgs0m%BqO{DV_&qU_gVK(nn+BgR}_2><`m8Y)8VN^c{+atOzC4onEi>5)-)B4AFS+&py^$QsEkx ziZ0Plx9m$8R_(hDYt?%f=msrU*yNyISd937gOf%|NDmkcP2Z>7dTd$jTBY@mJ!a)6Qn<8iYmAM!pQcyRjH*z_L-NzJs%7Y}w zq|6a1#k;qm!sgAXh?`qiqEHVGxp!=hS=fWv0&t8O~mgfPE3 z!~&Dr#+l>jMe8t`Ze|Zo8pL?BthBMcwi*r`}E{{OlqK!jL9SZGH<# zdq@D767tx|nQL%#h(0`sXL%HlUU)#*^ws9&xC$^0~_)MO#_UgN+&be}K`@NvF+nt!k&6j1B z@nz3BjRYI^aao)?D<*Pfomfr(BKiC7-hINwZBo~ji2Ei`64H}o?u2<5(?Lc>^8La_dB8YTNelui@|Sze^zzZn zzin_5yas{pTiC{?r*Kj3=Hv#8Ulfigxb0h{*JUWsTqp#_=K>}zp*_%C*s&Zx%TOa_ zoa6}iljYW*C~EZ|0z?S6wkk3#1@lpHS zdxE<=YGIEHYUnc>0IYDL(24?Q(yt;vRF9I*&BO~Pyr@WsD`pV2#0h_|>m- zTmg%HfG97O1f@|32o*6o%5t*d_9Irjb=vW|q}>s%Zl)qlMPHJ(b8c!Z!|9 zQ7e$Gdk&=jevN6`tfg(zWjn?mRBROx(NVJoV^Yslq!qdfO$pa7H;6099#nyRX7P2z zV{~n3Xb9L*_8`Z1*%QFrld!aoIKg(JPPGuyZdJ5F0O3|#;YmUt>+lla;J*{)R#T~y z-9TH;5L{1~W>-+yjHAucsE4Q0$*`WZxOE?}r_2sh!`d8+Q2=tPx3JU#x#(~IOV|Di zp)@xlv+$)YUM-dBC)jzFjp)sV}~FDs+3wu zg0KKeNyL6nTe7!i5Uv7(aK`hq-}Jn(wgPfTKowZg7`I+uNnFroD>|Gw@cG|Mys`-S($=30o%>%B2 zZq<`@J|8^7Pexbd>u$Z6BhU%yqra?>N+@2A6zWR7g+8{};5r9(n!YKfdPs&wOFdE% zUD=Oo=gm~0IFh|j4H|84Hbb>XdttOh3k1ue|3Q!d??DV9mN(_;Dx|{&^QiZ#K^vs-k9t-lx; zOnky*{l%wSQ2OGdiNQX%jsyBTaJl)8xd#_LAjL82!V*PB1L1loe>J#{5q_k}%=2(# zpvsOiUV)T(%6am7=NPv;uKI!xDF|dm^qXg*whN%fzDf>dJoK>a4Yjxnzy6XsyF+kH zNN;>Y-bqPlSn%43*pu~yn=RPByI}-tZj99v%0bs~OcE{B(Arp%of-Gy@xm82Cqb~L z5tJ8p*KE?!QulRAmB<6W-8_AFtl>S{r_5~#LIXf6%Dy&MbmJa=W*UQjk%dgM@A`|f zhlW_d9@x{RkJLj@8Xe^Yg_Zeor*W)qz8y<(J#9P~;<84?*dC{TXNVrU(Bq%4_IaN! z?Bk9b$JrAd34*_Khj-5FO+tHm|4csb(e4JfN5Fe7BmaN)P_;6Z^F!vPMZmwP(?&{8 z{6mgFN`gqe$j$R70UBy_3^fO92z(oH-F+^J&z7b08e(Xvt_5RbJN&`$o-Trn!C+#2 zM~ag!vD3UY{+-jvCRU_>c~?hM&xL+H0PS)y2vVCYhKT4BabmejdtaV(=&dTCL^a!p zF?^QiFG1f=mdE}fP2YAielJo3_px=X>B~aGOQ{bVHc4_a{U$Vc_FrLaupVnqJ!Nt8 z6;h@EE_(f~=C`61ZnoO8ULW?vU@>v6`5|>?iYM`GqwmBc~OD3;Ta4@V3Da@w6Z!xbQ_c+mmj1p774^qmyEyR&|?V-uMpB- z7D*qbo!A$i_iqKrx-4lGKV9br42t&vXO*KlA0e>u(`~^uCBE#z`dS7dH;5o-({_YL zFKapr9&^tgd!JIf6}F^-v%=DnVHeTlv?AEM(O^EfBrX9?q7S2mo3 z2kd@}Fo(mnfq9xRnvwZ3Yo3hm#yNP(7^q^GL`n%|Y9!5O`?^xWdJQntvbq}fOAX%w z+F^ud1h$5mTI-~`MN3i-T8f(=9O8DiWr{%RgJ6xd)W(cBsZH>b^Z}6cXiGPNAwHVQ zBz$`bCo(ImjLB4Zq^Ij3e$-Di`aOO=NM}tZ`FUQ*jLKAZmFFc|AR zy1{@BNL`# z5W`-RgWGGB4-LQZ1tme22QMcuKmCO8QV4@ZANy&@AR-8;Z)587Mi@SwI0W8>1}9k< z$16Sy_z`?6@^b9YfFAeNEiEP>FDHaP7&k{;=>oB=NO6DHM^i36viDyI5H>5OIsX*p zxq5TaP)l0=%-quBT-0b+9eRsr&Io5Jrp86ozAu&{R^q=88-bRYmAI$!Ef^ql*BC1rEuncc3MB@u-gU)=Hd;L{BN!$F% zGXuL5kiwbmlEa_)AGsUFzUnLI(HmiDjXZt3tpI z4L1CDOzTw&-hF*hMiR&z46pQ=FD=HVuARjoC_-e2e+)f?jhpk~ncCQVOFDc!zpM@7 z#MH8XzCX7(4m8SNM}tY?bIdsnkf`!e@`3OgI<0kfCS%f1#U9#=1a7sawv1~FuGhmP zIFro*6mj>ZEigv56uEGLNPtj;(n0a4G8#Z$|1Lun`{<*4QSzlBSex^FwsbRNPscAi zz^&1Fr@I0c~v=A^%!ap0@mI81LgJ;s(p>f~ZGt&s8kU z%gyKeQnwr|hI5QhJhvke&}F#&CGaEwrnfJ%G|-X^E; z9F@Jk#V0~uY>3R)$3x6J=#vQl1Y|B`pJq+Am+LkqpZTrO4p|opFqWq;K{5QA**T6y zS2G+oVdtiSCvGX+et3D`Z`pxib%qd>rKqDfVnLVgH6{4R6v@RrD6W@ z=z)Fbw6&KssDXYk@S3gos`JA(5LklO)D1IquAG^v1>gy|xaY%Aq|2 zRZJ|cGDmd>JwFodahZi7o~o<6G?Erc+;=9|g&wh45}*(PU{DJFHZ2O zPZdaV5ho0&mt+*ySH}>A7|GR`h0tQ$%^E*7l`;3dc943=#)e9&EU*4TUwXg~fS@0n zD>zqGWUpi6;a^q72TTRr>6+q#T&>K$RDt+40SNTV9}Z(5VW?YwnRV>H_$Pm}fJ%an z^~)Qptf~1@xFMRyMP~HehQ2sgp0mZiNjK4Jq(jT8FL2`|uB=wD`{40?yau#VPPHyw zGSGQeVR(ZG=d0$~Ed0$8vI!((HCz5>B%obWak(XR4dK9a7;F2j3>LDx-wOqd{=~uc zR6m(2J4}SOwvdu&;$JO3*$CV57+W(L*pHK`vm+LOJ*xTX3rch)Kuj<)^%E}i$)(ni zluP)35}eM%kz5%BG#OTa7>QJ+ub6ZR72K;QoFqoh-lDIsZPTu7MxW$h$g-1P%)PXy z&iBP(skq9(eW>pKVnP@O&Nq=i<4_mtDFX}9Q%4|&A5}u=q; zD-nMbcV2wzD9eaRk_M)_zczqaGPW2$d&U|cC!(J>o~yW_v|=l*U@`-R}LLrdfmw-X?) zB-GDjSsx^$I;VFSqB84tl3e-2$^4)pS{TQYb!0T^bG6n(JshgqH37=ngmeQlr3_2>1bH4GsWwS}-)v9?{wD&Xoz;`YR(1zR&e0gx*xUrx zH5=3mlfD%0sD>WOz|Y%6C)ORb$Rl&utj8nR;To@kc?ef6u;OyMRs^2&tdA6k!D#P~ z;wQ01Az3jR2_(ocVJa2uoxBVBP;I#%Px53!4513XwNS_|E|nLnnMk2q;*7_bIu^s>g2oG;p;!Z>R(;s^%SU}ATO_n5 z-OVYSEVX#SI#@*=bUp(8jY9Vm|2L_AJwEBjsgD{HqLZ@9-LsMUwMmCw!fP(wKC0@g z_6mN2sZwd&O%p%Lt`aLdcp25sqnuFX7ULe-5qhx6+UJb(ej;YU2BPs{S64zr&}0;nP^7=bjLdE)N3b>@+DX z;s~uvV$*@#9W;SO6oooRKJJqNaWB1auB14^fwdgWUbC@g>O z$@^On^00i`LIi`}o0*!2UzB5cIP_i`V2%OaElCAb$- zqUP_6{L?x+1nc5(Hu-D62h(H$Ws@}VaDE>H;o^i22qJHiK~7N{DKx^Hd38c83+QzT zXcu0@f<-o?{>3BXoH=JF;j5?Az>xelw{@=`XC8DNT+CZv?b1zZ8JPGyoaW4?%ge40 z{zszFT!Rgr+Puumr1Tvys(nD7{+tU_M|oUa@<91PB~{wKmUm$ygvgb7$=o}qJCH4H zNUwM)NJ?ddEB&DjtyWQoHF1Q?@e?fhN^o6WmS0T^IOi*t=-Af7FFvf_kPcO8*MV}) zeBM$HUM^tn)dqtJF-|)~8TuHgnOcAvF}R1gn}fyGG((K{5^reO?Vc|_y}#O6EA!s( z`Sl%!JDAcnZlK-2HIo(4`f-FS%1mqx+*uNJ#C=mo@knno-67Mwp5@ zpLA~^i?xrr;%9Gs7#r;|6$V78kEVO-O@8MNh4`9&p#B%(&3wEsG=^2GT{;ozXWZL* z_pI+!zt|C53yes|CA^yHzs(k#mzTQm1WDYy2ku$sm!w>)WocR!?*j zBXB`kRc1tpNr)kxpml{qeffSh6%1q?@wI8Pi@dLD=^Tq#9rS4V4mr$IAkHXw7H~LI zq^nlieSo2ig*+?nUi7PtnKgzotXKKQ(;1`6b6-Db0g&|lGy`O2DNmZ2SHQz12h64i%xOB9zI1+ zp#Q zQee3PWno$7uSS=T+$Xn+>j+X>CWdcRfBD<^+$LJ^Dr=coKrE7OM{E5T^TQJKl0Fjc z#%aBt;0Z)!Vu}~lhBParwkQ6WzA2h`gFqr~pzl2&nqaYugv_mXO0m%YGB2C7cMC_KRvG+Jl$idD-DQU+=toSx}kbDE7F{z*v&%r#G7LX3) zDWEL)G#XV-Ii&F}ZeK-ns^F|5YJgUCG%a(iBbjL^kW>fVk|o8zk}s#5f13FEyHtXT z{vLb_z+mUH2OBMdTCBwYaX^m0loQ8!k^u{B^S&3|g=UHEic7+hD_ELURqe~_xN?te zE4!5x)7m=K6fYd=+mfmW<({-?B*zY S&igcHw6kuuFlX^?9+ti0J>msQF(s@y(k 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%0D2qX`+V_3 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�LngjJDoyV{#gBY5-od81SOWC#nw6GmMY#0jdH4Libd zEXlkShd;reRao}+aN&RT%eki5*5AHdgT^AUf8=$J^diIyK<+W8+JMbG+pj3%!N~t? z4VQ>qPWwQjfoRZBJEdgWhzjdAQs)8_Ixg{I)cUjSkBu)SfwZsnCc}AP7`uox8@>-R zyCkbBOq@aOet@xNoikoe7B6%(9KrxAtHn#$v-P^Dg+Ttzj;PMrTKBEFQk4W|F>PhQ zmpf~A-fBQI-^a(ZjKARyy9-Kl3v0`)J*bC~KxowOou*O%CcuznN6OaSumfl{=Ri zMB@-C=Z8%Pf>6*RKVv%OB#_Otd}m}5-eu0h_2__$m&CyG_qi;pPLqsSES9ZAN?552Z z%}!s7drd70gRC+e%Ez~eiL&$fkVREkVE%VOnKLZ`&-2vsl{gmflb2r5QHK-9|Jjdk BpfCUc literal 0 HcmV?d00001 diff --git a/ui/icons/beam_testnet.png b/ui/icons/beam_testnet.png new file mode 100644 index 0000000000000000000000000000000000000000..6a6e190d3eaf3f5e8c7ca55579693947e93a5bb7 GIT binary patch literal 60631 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

`2 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 literal 0 HcmV?d00001 diff --git a/ui/icon.ico b/ui/icons/icon_mainnet.ico similarity index 100% rename from ui/icon.ico rename to ui/icons/icon_mainnet.ico diff --git a/ui/icons/icon_masternet.ico b/ui/icons/icon_masternet.ico new file mode 100644 index 0000000000000000000000000000000000000000..b0a08c26736dc4c4ec088f752093ef33fe4da90a GIT binary patch literal 67646 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ϕCPc%Az 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 literal 0 HcmV?d00001 diff --git a/ui/ui.cpp b/ui/ui.cpp index c33c8fb13..bb424507b 100644 --- a/ui/ui.cpp +++ b/ui/ui.cpp @@ -32,6 +32,7 @@ #include "viewmodel/settings_view.h" #include "viewmodel/messages_view.h" #include "viewmodel/statusbar_view.h" +#include "viewmodel/theme.h" #include "model/app_model.h" #include "wallet/wallet_db.h" @@ -95,7 +96,7 @@ int main (int argc, char* argv[]) QApplication app(argc, argv); - app.setWindowIcon(QIcon(":/assets/icon.png")); + app.setWindowIcon(QIcon(Theme::iconPath())); QApplication::setApplicationName(AppName); @@ -185,6 +186,13 @@ int main (int argc, char* argv[]) } } + qmlRegisterSingletonType( + "Beam.Wallet", 1, 0, "Theme", + [](QQmlEngine* engine, QJSEngine* scriptEngine) -> QObject* { + Q_UNUSED(engine) + Q_UNUSED(scriptEngine) + return new Theme; + }); qmlRegisterType("Beam.Wallet", 1, 0, "StartViewModel"); qmlRegisterType("Beam.Wallet", 1, 0, "LoadingViewModel"); qmlRegisterType("Beam.Wallet", 1, 0, "MainViewModel"); diff --git a/ui/view/addresses.qml b/ui/view/addresses.qml index 8eaf445ff..3cb44631b 100644 --- a/ui/view/addresses.qml +++ b/ui/view/addresses.qml @@ -12,14 +12,14 @@ ColumnLayout { AddressBookViewModel {id: viewModel} EditAddress { - id: editActiveAddress - parentModel: viewModel + id: editActiveAddress + parentModel: viewModel } EditAddress { - id: editExpiredAddress - parentModel: viewModel - isExpiredAddress: true + id: editExpiredAddress + parentModel: viewModel + isExpiredAddress: true } anchors.fill: parent @@ -28,13 +28,13 @@ ColumnLayout { Layout.minimumHeight: 40 Layout.maximumHeight: 40 font.pixelSize: 36 - color: Style.white + color: Style.content_main text: qsTr("Addresses") } StatusBar { - id: status_bar - model: statusbarModel + id: status_bar + model: statusbarModel } ConfirmationDialog { @@ -79,17 +79,17 @@ ColumnLayout { Layout.fillHeight: true AddressTable { - id: activeAddressesView - model: viewModel.activeAddresses - parentModel: viewModel - visible: false - - editDialog: editActiveAddress - + id: activeAddressesView + model: viewModel.activeAddresses + parentModel: viewModel + visible: false + + editDialog: editActiveAddress + sortIndicatorVisible: true sortIndicatorColumn: 4 - sortIndicatorOrder: Qt.DescendingOrder - + sortIndicatorOrder: Qt.DescendingOrder + Binding{ target: viewModel property: "activeAddrSortRole" @@ -100,22 +100,22 @@ ColumnLayout { target: viewModel property: "activeAddrSortOrder" value: activeAddressesView.sortIndicatorOrder - } + } } AddressTable { - id: expiredAddressesView - model: viewModel.expiredAddresses - visible: false - parentModel: viewModel - - editDialog: editExpiredAddress - isExpired: true - + id: expiredAddressesView + model: viewModel.expiredAddresses + visible: false + parentModel: viewModel + + editDialog: editExpiredAddress + isExpired: true + sortIndicatorVisible: true sortIndicatorColumn: 4 - sortIndicatorOrder: Qt.DescendingOrder - + sortIndicatorOrder: Qt.DescendingOrder + Binding{ target: viewModel property: "expiredAddrSortRole" @@ -126,28 +126,28 @@ ColumnLayout { target: viewModel property: "expiredAddrSortOrder" value: expiredAddressesView.sortIndicatorOrder - } + } } CustomTableView { - id: contactsView - - property int rowHeight: 69 - property int resizableWidth: parent.width - actions.width - - anchors.fill: parent + id: contactsView + + property int rowHeight: 69 + property int resizableWidth: parent.width - actions.width + + anchors.fill: parent frameVisible: false selectionMode: SelectionMode.NoSelection backgroundVisible: false - model: viewModel.contacts - + model: viewModel.contacts + TableViewColumn { role: viewModel.nameRole title: qsTr("Comment") width: 280 * contactsView.resizableWidth / 740 movable: false - } - + } + TableViewColumn { role: viewModel.addressRole title: qsTr("Contact") @@ -167,21 +167,21 @@ ColumnLayout { elide: Text.ElideMiddle anchors.verticalCenter: parent.verticalCenter text: styleData.value - color: Style.white + color: Style.content_main copyMenuEnabled: true onCopyText: viewModel.copyToClipboard(text) } } } - } - + } + TableViewColumn { role: viewModel.categoryRole title: qsTr("Category") width: 290 * contactsView.resizableWidth / 740 movable: false - } - + } + TableViewColumn { //role: "status" id: actions @@ -190,8 +190,8 @@ ColumnLayout { movable: false resizable: false delegate: txActions - } - + } + rowDelegate: Item { height: contactsView.rowHeight @@ -202,16 +202,16 @@ ColumnLayout { Rectangle { anchors.fill: parent - color: styleData.selected ? Style.bright_sky_blue : Style.light_navy + color: styleData.selected ? Style.content_accent_third : Style.background_third visible: styleData.selected ? true : styleData.alternate } - } - + } + itemDelegate: TableItem { text: styleData.value elide: styleData.elideMode - } - + } + Component { id: txActions Item { @@ -249,7 +249,7 @@ ColumnLayout { viewModel.deleteAddress(contextMenu.address); } } - } + } } } diff --git a/ui/view/assets/icon_masternet.png b/ui/view/assets/icon_masternet.png new file mode 100644 index 0000000000000000000000000000000000000000..58e392041651fd82f9c95e2249b2c13a13cd73ed GIT binary patch literal 16922 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 KMNUMnLSTZ54AmR} literal 0 HcmV?d00001 diff --git a/ui/view/assets/icon_testnet.png b/ui/view/assets/icon_testnet.png new file mode 100644 index 0000000000000000000000000000000000000000..6a6e190d3eaf3f5e8c7ca55579693947e93a5bb7 GIT binary patch literal 60631 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

`2 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 literal 0 HcmV?d00001 diff --git a/ui/view/color_themes/AbstractColors.qml b/ui/view/color_themes/AbstractColors.qml new file mode 100644 index 000000000..14a38b969 --- /dev/null +++ b/ui/view/color_themes/AbstractColors.qml @@ -0,0 +1,23 @@ +import QtQuick 2.11 + +QtObject { + property color navigation_bar_background; + property color navigation_bar_active; + property color navigation_bar_passive; + property color navigation_bar_shadow; + property color background; + property color background_second; + property color background_third; + property color background_fourth; + property color background_emphasize; + property color background_emphasize_alternate; + property color background_inconspicuous; + property color content_main; + property color content_accent_first; + property color content_accent_second; + property color content_accent_third; + property color content_inconspicuous; + property color content_disabled; + property color validator_warning; + property color validator_error; +} diff --git a/ui/view/color_themes/Mainnet.qml b/ui/view/color_themes/Mainnet.qml new file mode 100644 index 000000000..4fe78254f --- /dev/null +++ b/ui/view/color_themes/Mainnet.qml @@ -0,0 +1,24 @@ +import QtQuick 2.11 + +AbstractColors { + // Color definitions + property color navigation_bar_background: "#02253c" + property color navigation_bar_active: "#00f6d2" + property color navigation_bar_passive: "#d6d9e0" + property color navigation_bar_shadow: "#00f6d2" + property color background: "#032e49" + property color background_second: "#1c435b" + property color background_third: "#0e3850" + property color background_fourth: "#09425e" + property color background_emphasize: "#ffffff" + property color background_emphasize_alternate: "#33566b" + property color background_inconspicuous: "#708090" + property color content_main: "#ffffff" + property color content_accent_first: "#da68f5" + property color content_accent_second: "#00f6d2" + property color content_accent_third: "#0bccf7" + property color content_inconspicuous: "#8da1ad" + property color content_disabled: "#889da9" + property color validator_warning: "#f4ce4a" + property color validator_error: "#ff625c" +} diff --git a/ui/view/color_themes/Masternet.qml b/ui/view/color_themes/Masternet.qml new file mode 100644 index 000000000..dd36b95ce --- /dev/null +++ b/ui/view/color_themes/Masternet.qml @@ -0,0 +1,23 @@ +import QtQuick 2.11 + +AbstractColors { + property color navigation_bar_background: "#101010" + property color navigation_bar_active: "#00f6d2" + property color navigation_bar_passive: "#d6d9e0" + property color navigation_bar_shadow: "#00f6d2" + property color background: "#171717" + property color background_second: "#323232" + property color background_third: "#1D1D1D" + property color background_fourth: "#3D3D3D" + property color background_emphasize: "#ffffff" + property color background_emphasize_alternate: "#242424" + property color background_inconspicuous: "#708090" + property color content_main: "#ffffff" + property color content_accent_first: "#da68f5" + property color content_accent_second: "#00f6d2" + property color content_accent_third: "#0bccf7" + property color content_inconspicuous: "#8da1ad" + property color content_disabled: "#889da9" + property color validator_warning: "#f4ce4a" + property color validator_error: "#ff625c" +} diff --git a/ui/view/color_themes/Testnet.qml b/ui/view/color_themes/Testnet.qml new file mode 100644 index 000000000..e188aa5cb --- /dev/null +++ b/ui/view/color_themes/Testnet.qml @@ -0,0 +1,23 @@ +import QtQuick 2.11 + +AbstractColors { + property color navigation_bar_background: "#181223" + property color navigation_bar_active: "#00f6d2" + property color navigation_bar_passive: "#d6d9e0" + property color navigation_bar_shadow: "#00f6d2" + property color background: "#1e172c" + property color background_second: "#342e41" + property color background_third: "#292236" + property color background_fourth: "#3e384a" + property color background_emphasize: "#ffffff" + property color background_emphasize_alternate: "#1e172c" + property color background_inconspicuous: "#708090" + property color content_main: "#ffffff" + property color content_accent_first: "#da68f5" + property color content_accent_second: "#00f6d2" + property color content_accent_third: "#0bccf7" + property color content_inconspicuous: "#8da1ad" + property color content_disabled: "#889da9" + property color validator_warning: "#f4ce4a" + property color validator_error: "#ff625c" +} diff --git a/ui/view/controls/AddressComboBox.qml b/ui/view/controls/AddressComboBox.qml index e875d6747..934b03e8a 100644 --- a/ui/view/controls/AddressComboBox.qml +++ b/ui/view/controls/AddressComboBox.qml @@ -29,7 +29,7 @@ ComboBox { implicitWidth: 100 implicitHeight: 40 opacity: enabled ? 1 : 0.3 - color:itemDelegate.highlighted ? Style.bluey_grey : Style.combobox_color + color:itemDelegate.highlighted ? Style.content_inconspicuous : Style.content_accent_third } } @@ -55,7 +55,7 @@ ComboBox { width: control.width height: 1 y: control.height - 1 - color: Style.separator_color + color: Style.background_emphasize_alternate } } @@ -69,7 +69,7 @@ ComboBox { Layout.fillWidth: true Layout.minimumHeight: control.height Layout.leftMargin: 20 - color: Style.disable_text_color + color: Style.content_disabled font.pixelSize: 12 verticalAlignment: Text.AlignVCenter @@ -78,7 +78,7 @@ ComboBox { Rectangle { Layout.fillWidth: true height: 1 - color: Style.separator_color + color: Style.background_emphasize_alternate }*/ ListView { id: listView @@ -97,14 +97,14 @@ ComboBox { background: Item { Rectangle { - color: Style.combobox_color + color: Style.content_accent_third anchors.left: parent.left anchors.right: parent.right height: control.height } Rectangle { anchors.fill: parent - color: Style.combobox_color + color: Style.content_accent_third radius: 10 } } diff --git a/ui/view/controls/AddressTable.qml b/ui/view/controls/AddressTable.qml index a24d923ee..d3fde6460 100644 --- a/ui/view/controls/AddressTable.qml +++ b/ui/view/controls/AddressTable.qml @@ -1,29 +1,29 @@ -import QtQuick 2.11 -import QtQuick.Controls 1.4 -import QtQuick.Controls 2.3 -import "." - +import QtQuick 2.11 +import QtQuick.Controls 1.4 +import QtQuick.Controls 2.3 +import "." + CustomTableView { - id: rootControl - - property int rowHeight: 69 - property int resizableWidth: parent.width - actions.width - property var parentModel - property bool isExpired: false - property var editDialog - anchors.fill: parent + id: rootControl + + property int rowHeight: 69 + property int resizableWidth: parent.width - actions.width + property var parentModel + property bool isExpired: false + property var editDialog + anchors.fill: parent frameVisible: false selectionMode: SelectionMode.NoSelection backgroundVisible: false - + TableViewColumn { role: parentModel.nameRole title: qsTr("Comment") width: 150 * rootControl.resizableWidth / 750 resizable: false movable: false - } - + } + TableViewColumn { role: parentModel.addressRole title: qsTr("Address") @@ -44,38 +44,38 @@ CustomTableView { elide: Text.ElideMiddle anchors.verticalCenter: parent.verticalCenter text: styleData.value - color: Style.white + color: Style.content_main copyMenuEnabled: true onCopyText: parentModel.copyToClipboard(text) } } } - } - + } + TableViewColumn { role: parentModel.categoryRole title: qsTr("Category") width: 150 * rootControl.resizableWidth / 750 resizable: false movable: false - } - + } + TableViewColumn { role: parentModel.expirationRole title: qsTr("Expiration date") width: 150 * rootControl.resizableWidth / 750 resizable: false movable: false - } - + } + TableViewColumn { role:parentModel.createdRole title: qsTr("Created") width: 150 * rootControl.resizableWidth / 750 resizable: false movable: false - } - + } + TableViewColumn { id: actions title: "" @@ -83,8 +83,8 @@ CustomTableView { movable: false resizable: false delegate: txActions - } - + } + rowDelegate: Item { height: rootControl.rowHeight @@ -95,16 +95,16 @@ CustomTableView { Rectangle { anchors.fill: parent - color: styleData.selected ? Style.bright_sky_blue : Style.light_navy + color: styleData.selected ? Style.content_accent_third : Style.background_third visible: styleData.selected ? true : styleData.alternate } - } - + } + itemDelegate: TableItem { text: styleData.value elide: styleData.elideMode - } - + } + Component { id: txActions Item { @@ -129,8 +129,8 @@ CustomTableView { } } } - } - + } + ContextMenu { id: contextMenu modal: true @@ -152,5 +152,5 @@ CustomTableView { viewModel.deleteAddress(contextMenu.address); } } - } + } } \ No newline at end of file diff --git a/ui/view/controls/AvailablePanel.qml b/ui/view/controls/AvailablePanel.qml index c3740673a..759c1fd57 100644 --- a/ui/view/controls/AvailablePanel.qml +++ b/ui/view/controls/AvailablePanel.qml @@ -7,7 +7,7 @@ import "." Rectangle { id: panel radius: 10 - color: Style.dark_slate_blue + color: Style.background_second clip: true @@ -28,7 +28,7 @@ Rectangle { anchors.topMargin: 30 anchors.leftMargin: 30 - color: Style.white + color: Style.content_main text: qsTr("Available") } @@ -44,7 +44,7 @@ Rectangle { id: amount_text font.pixelSize: 36 font.styleName: "Light"; font.weight: Font.Light - color: Style.bright_teal + color: Style.content_accent_second text: value anchors.bottom: parent.bottom @@ -56,7 +56,7 @@ Rectangle { id: currency_text font.pixelSize: 24 font.styleName: "Light"; font.weight: Font.Light - color: Style.bright_teal + color: Style.content_accent_second text: "BEAM" anchors.bottom: parent.bottom diff --git a/ui/view/controls/ChangePasswordDialog.qml b/ui/view/controls/ChangePasswordDialog.qml index 270cc78b3..4c89d6fb3 100644 --- a/ui/view/controls/ChangePasswordDialog.qml +++ b/ui/view/controls/ChangePasswordDialog.qml @@ -18,7 +18,7 @@ Dialog { background: Rectangle { radius: 10 - color: Style.dark_slate_blue + color: Style.background_second anchors.fill: parent } @@ -31,7 +31,7 @@ Dialog { SFText { anchors.horizontalCenter: parent.horizontalCenter text: qsTr("Change wallet password") - color: Style.white + color: Style.content_main font.pixelSize: 24 font.styleName: "Bold"; font.weight: Font.Bold } @@ -42,7 +42,7 @@ Dialog { SFText { text: qsTr("Enter old password") - color: Style.white + color: Style.content_main font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold } @@ -53,7 +53,7 @@ Dialog { width: parent.width font.pixelSize: 12 - color: Style.white + color: Style.content_main echoMode: TextInput.Password } } @@ -64,7 +64,7 @@ Dialog { SFText { text: qsTr("Enter new password") - color: Style.white + color: Style.content_main font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold } @@ -75,7 +75,7 @@ Dialog { width: parent.width font.pixelSize: 12 - color: Style.white + color: Style.content_main echoMode: TextInput.Password } } @@ -86,7 +86,7 @@ Dialog { SFText { text: qsTr("Confirm new password") - color: Style.white + color: Style.content_main font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold } @@ -97,7 +97,7 @@ Dialog { width: parent.width font.pixelSize: 12 - color: Style.white + color: Style.content_main echoMode: TextInput.Password } @@ -109,7 +109,7 @@ Dialog { SFText { id: error - color: Style.validator_color + color: Style.validator_error font.pixelSize: 10 } } diff --git a/ui/view/controls/ConfirmationDialog.qml b/ui/view/controls/ConfirmationDialog.qml index 03f7b5dc6..498b1048c 100644 --- a/ui/view/controls/ConfirmationDialog.qml +++ b/ui/view/controls/ConfirmationDialog.qml @@ -20,7 +20,7 @@ Dialog { background: Rectangle { radius: 10 - color: Style.dark_slate_blue + color: Style.background_second anchors.fill: parent } @@ -29,7 +29,7 @@ Dialog { anchors.fill: parent padding: 20 font.pixelSize: 14 - color: Style.white + color: Style.content_main wrapMode: Text.Wrap horizontalAlignment : Text.AlignHCenter } @@ -38,13 +38,13 @@ Dialog { background: Rectangle { radius: 10 - color: Style.dark_slate_blue + color: Style.background_second anchors.fill: parent } contentItem: RowLayout { Item { - Layout.fillWidth: true + Layout.fillWidth: true } Row { spacing: 20 @@ -56,25 +56,25 @@ Dialog { id: cancelButton focus: true text: qsTr("cancel") - onClicked: { - rejected(); - close(); + onClicked: { + rejected(); + close(); } } CustomButton { id: okButton - palette.button: Style.bright_teal + palette.button: Style.content_accent_second text: qsTr("delete") - palette.buttonText: Style.marine + palette.buttonText: Style.background onClicked: { - accepted(); - close(); + accepted(); + close(); } } } Item { - Layout.fillWidth: true + Layout.fillWidth: true } } } diff --git a/ui/view/controls/ContextMenu.qml b/ui/view/controls/ContextMenu.qml index 344b5e75e..831660138 100644 --- a/ui/view/controls/ContextMenu.qml +++ b/ui/view/controls/ContextMenu.qml @@ -15,7 +15,7 @@ Menu { implicitWidth: 200 implicitHeight: 40 - icon.color: Style.white + icon.color: Style.content_main icon.width: 12 icon.height: 12 font.pixelSize: 14 @@ -36,7 +36,7 @@ Menu { icon: control.icon text: control.text font: control.font - color: Style.white + color: Style.content_main opacity: enabled ? 1.0 : 0.3 } @@ -46,7 +46,7 @@ Menu { implicitWidth: 200 implicitHeight: 40 opacity: enabled ? 1 : 0.3 - color: control.hovered ? Style.bright_sky_blue : "transparent" + color: control.hovered ? Style.content_accent_third : "transparent" } } @@ -54,8 +54,8 @@ Menu { implicitWidth: 200 implicitHeight: 40 border.width: 1 - border.color: Style.separator_color - color: Style.dark_slate_blue + border.color: Style.background_emphasize_alternate + color: Style.background_second //opacity: 0.1 radius: 10 } diff --git a/ui/view/controls/CustomButton.qml b/ui/view/controls/CustomButton.qml index 2da6accbe..9df267f82 100644 --- a/ui/view/controls/CustomButton.qml +++ b/ui/view/controls/CustomButton.qml @@ -9,8 +9,8 @@ import "." Button { id: control - palette.button: Style.separator_color - palette.buttonText: Style.white + palette.button: Style.background_emphasize_alternate + palette.buttonText: Style.content_main property alias textOpacity: rect.opacity property alias shadowSamples: drop_shadow.samples property alias shadowRadius: drop_shadow.radius @@ -42,7 +42,7 @@ Button { text: control.text font: control.font - color: control.enabled ? control.palette.buttonText : Style.disable_text_color + color: control.enabled ? control.palette.buttonText : Style.content_disabled } Keys.onPressed: { @@ -52,7 +52,8 @@ Button { background: Rectangle { id: rect radius: 50 - color: control.enabled ? control.palette.button : "slategrey" + color: control.enabled ? control.palette.button : Style.content_disabled + opacity: control.enabled ? 1.0 : 0.6 width: control.width height: control.height @@ -63,7 +64,7 @@ Button { anchors.fill: rect radius: 7 samples: 9 - color: "white" + color: Style.content_main source: rect visible: control.visualFocus || control.hovered } diff --git a/ui/view/controls/CustomCheckBox.qml b/ui/view/controls/CustomCheckBox.qml index eb658db9a..1660c8e13 100644 --- a/ui/view/controls/CustomCheckBox.qml +++ b/ui/view/controls/CustomCheckBox.qml @@ -5,8 +5,8 @@ import QtQuick.Controls.impl 2.4 T.CheckBox { id: control - palette.windowText: Style.white - palette.text: Style.bright_teal + palette.windowText: Style.content_main + palette.text: Style.content_accent_second implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, @@ -27,13 +27,13 @@ T.CheckBox { color: "transparent" border.width: control.visualFocus ? 2 : 1 - border.color: control.visualFocus ? control.palette.highlight : Style.bluey_grey + border.color: control.visualFocus ? control.palette.highlight : Style.content_inconspicuous ColorImage { x: (parent.width - width) / 2 y: (parent.height - height) / 2 defaultColor: "#353637" - color: control.enabled ? control.palette.text : Style.disable_text_color + color: control.enabled ? control.palette.text : Style.content_disabled source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/images/check.png" visible: control.checkState === Qt.Checked } diff --git a/ui/view/controls/CustomComboBox.qml b/ui/view/controls/CustomComboBox.qml index 2695b07da..309c19c2f 100644 --- a/ui/view/controls/CustomComboBox.qml +++ b/ui/view/controls/CustomComboBox.qml @@ -16,7 +16,7 @@ ComboBox { width: control.width contentItem: SFText { text: modelData - color: Style.white + color: Style.content_main elide: Text.ElideMiddle verticalAlignment: Text.AlignVCenter font.pixelSize: 12 @@ -28,7 +28,7 @@ ComboBox { implicitWidth: 100 implicitHeight: 20 opacity: enabled ? 1 : 0.3 - color:itemDelegate.highlighted ? Style.bluey_grey : Style.combobox_color + color:itemDelegate.highlighted ? Style.content_accent_third : Style.content_inconspicuous } } @@ -43,7 +43,7 @@ ComboBox { rightPadding: control.indicator.width + control.spacing clip: true text: control.currentText - color: Style.white + color: Style.content_main font.pixelSize: 12 verticalAlignment: Text.AlignVCenter } @@ -53,7 +53,7 @@ ComboBox { width: control.width height: control.activeFocus || control.hovered ? 2 : 1 y: control.height - 1 - color: Style.white + color: Style.content_main opacity: (control.activeFocus || control.hovered)? 0.3 : 0.1 } } @@ -81,14 +81,14 @@ ComboBox { background: Item { Rectangle { - color: Style.combobox_color + color: Style.content_inconspicuous anchors.left: parent.left anchors.right: parent.right height: control.height } Rectangle { anchors.fill: parent - color: Style.combobox_color + color: Style.content_inconspicuous radius: 10 } } diff --git a/ui/view/controls/CustomProgressBar.qml b/ui/view/controls/CustomProgressBar.qml index c61ead339..83a0dfca5 100644 --- a/ui/view/controls/CustomProgressBar.qml +++ b/ui/view/controls/CustomProgressBar.qml @@ -27,7 +27,7 @@ T.ProgressBar { scale: control.mirrored ? -1 : 1 width: control.visualPosition * parent.width height: parent.height - color: Style.bright_teal + color: Style.content_accent_second } } @@ -38,15 +38,15 @@ T.ProgressBar { y: (control.height - height) / 2 height: 4 radius: 10 - border.color: Style.dark_slate_blue + border.color: Style.background_second color: "transparent" } - DropShadow { - anchors.fill: contentItem - radius: 5 - samples: 9 - color: Style.bright_teal - source: contentItem + DropShadow { + anchors.fill: contentItem + radius: 5 + samples: 9 + color: Style.content_accent_second + source: contentItem } } diff --git a/ui/view/controls/CustomRadioButton.qml b/ui/view/controls/CustomRadioButton.qml index 909810c32..e48cb9e5a 100644 --- a/ui/view/controls/CustomRadioButton.qml +++ b/ui/view/controls/CustomRadioButton.qml @@ -8,8 +8,8 @@ import "." T.RadioButton { id: control - palette.windowText: Style.white - palette.text: Style.bright_teal + palette.windowText: Style.content_main + palette.text: Style.content_accent_second implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem.implicitWidth + leftPadding + rightPadding) @@ -36,7 +36,7 @@ T.RadioButton { radius: width / 2 color: "transparent"//control.down ? control.palette.light : control.palette.base border.width: 1 //control.visualFocus ? 2 : 1 - border.color: Style.bluey_grey //control.visualFocus ? control.palette.highlight : control.palette.mid + border.color: Style.content_inconspicuous //control.visualFocus ? control.palette.highlight : control.palette.mid Rectangle { x: (parent.width - width) / 2 diff --git a/ui/view/controls/CustomSwitch.qml b/ui/view/controls/CustomSwitch.qml index a3b3b2ddb..0fe7474ff 100644 --- a/ui/view/controls/CustomSwitch.qml +++ b/ui/view/controls/CustomSwitch.qml @@ -17,13 +17,13 @@ T.Switch { //padding: 12 spacing: 12 - palette.text: Style.white + palette.text: Style.content_main contentItem: Text { rightPadding: control.indicator.width + control.spacing text: control.text font: control.font - color: control.checked && control.enabled ? control.palette.text : Style.bluey_grey + color: control.checked && control.enabled ? control.palette.text : Style.content_inconspicuous elide: Text.ElideRight verticalAlignment: Text.AlignVCenter } @@ -35,7 +35,7 @@ T.Switch { y: parent.height / 2 - height / 2 radius: 10 color: "transparent" - border.color: Style.bluey_grey + border.color: Style.content_inconspicuous Rectangle { x: control.checked ? parent.width - width - 2 : 2 @@ -43,7 +43,7 @@ T.Switch { width: 16 height: 16 radius: 10 - color: control.checked && control.enabled ? Style.bright_teal : Style.bluey_grey + color: control.checked && control.enabled ? Style.content_accent_second : Style.content_inconspicuous } } } \ No newline at end of file diff --git a/ui/view/controls/CustomTableView.qml b/ui/view/controls/CustomTableView.qml index cc23373df..7e694a8b4 100644 --- a/ui/view/controls/CustomTableView.qml +++ b/ui/view/controls/CustomTableView.qml @@ -19,7 +19,7 @@ TableView { implicitHeight: 16 radius: 6 anchors.fill: parent - color: Style.white + color: Style.background_emphasize opacity: 0.1 } } @@ -28,14 +28,14 @@ TableView { headerDelegate: Rectangle { height: headerHeight - color: Style.dark_slate_blue + color: Style.background_second IconLabel { anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left anchors.leftMargin: headerTextLeftMargin font.pixelSize: headerTextFontSize - color: tableView.sortIndicatorColumn == styleData.column ? Style.white : Style.bluey_grey + color: tableView.sortIndicatorColumn == styleData.column ? Style.content_main : Style.content_inconspicuous font.weight: tableView.sortIndicatorColumn == styleData.column ? Font.Bold : Font.Normal font.family: "SF Pro Display" font.styleName: "Regular" diff --git a/ui/view/controls/CustomToolButton.qml b/ui/view/controls/CustomToolButton.qml index bd15c3505..ac7025388 100644 --- a/ui/view/controls/CustomToolButton.qml +++ b/ui/view/controls/CustomToolButton.qml @@ -12,8 +12,8 @@ ToolButton { contentItem.implicitHeight + topPadding + bottomPadding) baselineOffset: contentItem.y + contentItem.baselineOffset - palette.buttonText: Style.white - palette.highlight: Style.white + palette.buttonText: Style.content_main + palette.highlight: Style.content_main palette.button: "transparent" padding: 8 spacing: 8 diff --git a/ui/view/controls/DefaultButton.qml b/ui/view/controls/DefaultButton.qml index 648198710..d59362cf1 100644 --- a/ui/view/controls/DefaultButton.qml +++ b/ui/view/controls/DefaultButton.qml @@ -4,8 +4,8 @@ import QtQuick.Controls.Styles 1.2 import "." CustomButton { - palette.button: Style.white - palette.buttonText: Style.white + palette.button: Style.content_main + palette.buttonText: Style.content_main textOpacity: 0.1 SFText { @@ -16,7 +16,7 @@ CustomButton { font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: parent.text visible: false diff --git a/ui/view/controls/EditAddress.qml b/ui/view/controls/EditAddress.qml index 78caaaf64..92a60cd43 100644 --- a/ui/view/controls/EditAddress.qml +++ b/ui/view/controls/EditAddress.qml @@ -20,7 +20,7 @@ Dialog { background: Rectangle { radius: 10 - color: Style.dark_slate_blue + color: Style.background_second anchors.fill: parent } @@ -33,7 +33,7 @@ Dialog { SFText { anchors.horizontalCenter: parent.horizontalCenter text: qsTr("Edit address") - color: Style.white + color: Style.content_main font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold } @@ -43,7 +43,7 @@ Dialog { SFText { text: qsTr("Address ID") - color: Style.white + color: Style.content_main font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold } @@ -54,7 +54,7 @@ Dialog { width: parent.width enabled: false font.pixelSize: 12 - color: Style.white + color: Style.content_main text: rootControl.addressItem ? rootControl.addressItem.address : "" } } @@ -64,7 +64,7 @@ Dialog { SFText { text: qsTr("Comment") - color: Style.white + color: Style.content_main font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold } @@ -74,7 +74,7 @@ Dialog { width: parent.width font.pixelSize: 12 - color: Style.white + color: Style.content_main enabled: false text: rootControl.addressItem ? rootControl.addressItem.name : "" } @@ -85,15 +85,15 @@ Dialog { SFText { text: qsTr("Expires") - color: Style.white + color: Style.content_main font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold } CustomComboBox { id: expires - width: 140 - height: 20 + width: 140 + height: 20 currentIndex: rootControl.addressItem && rootControl.addressItem.neverExpired ? 1 : 0 model: rootControl.isExpiredAddress ? ["in 24 hours (since now)", "never"] : ["in 24 hours (since now)", "never", "now"] @@ -107,7 +107,7 @@ Dialog { CustomButton { text: qsTr("cancel") icon.source: "qrc:/assets/icon-cancel.svg" - icon.color: Style.white + icon.color: Style.content_main onClicked: { rootControl.close(); } diff --git a/ui/view/controls/FeeSlider.qml b/ui/view/controls/FeeSlider.qml index b319f2d66..f973d4854 100644 --- a/ui/view/controls/FeeSlider.qml +++ b/ui/view/controls/FeeSlider.qml @@ -24,7 +24,7 @@ T.Slider { implicitWidth: 20 implicitHeight: 20 radius: width / 2 - color: control.enabled ? Style.bright_teal : Style.disable_text_color + color: control.enabled ? Style.content_accent_second : Style.content_disabled SFText { @@ -37,7 +37,7 @@ T.Slider { y: -26 font.pixelSize: 14 text: control.value.toFixed(control.precision) - color: control.enabled ? Style.bright_teal : Style.disable_text_color + color: control.enabled ? Style.content_accent_second : Style.content_disabled } } @@ -61,23 +61,23 @@ T.Slider { Rectangle { anchors.fill: parent - color: Style.white + color: Style.background_emphasize opacity: 0.1 radius: 2 } Repeater { - anchors.fill: parent - Rectangle { - y: (handle.width / 2) + 4 - x: (handle.width / 2) + ((control.availableWidth - handle.width) / control.to) * index - width: 1 - height: 4 - color: Style.bluey_grey - visible: control.showTicks - } - model: control.to + 1 - + anchors.fill: parent + Rectangle { + y: (handle.width / 2) + 4 + x: (handle.width / 2) + ((control.availableWidth - handle.width) / control.to) * index + width: 1 + height: 4 + color: Style.content_inconspicuous + visible: control.showTicks + } + model: control.to + 1 + } Item { @@ -87,14 +87,14 @@ T.Slider { SFText { font.pixelSize: 14 - color: Style.bluey_grey + color: Style.content_inconspicuous text: control.from.toFixed(control.precision) } SFText { anchors.right: parent.right font.pixelSize: 14 - color: Style.bluey_grey + color: Style.content_inconspicuous text: control.to.toFixed(control.precision) } } diff --git a/ui/view/controls/Led.qml b/ui/view/controls/Led.qml index 26bd0cfd1..0a9249fa3 100644 --- a/ui/view/controls/Led.qml +++ b/ui/view/controls/Led.qml @@ -17,7 +17,7 @@ Item { anchors.fill: parent radius: 3 - color: Style.bluey_grey + color: Style.content_inconspicuous } Rectangle { @@ -25,7 +25,7 @@ Item { anchors.fill: parent radius: 3 - color: Style.bright_teal + color: Style.content_accent_second visible: root.turned_on } @@ -33,7 +33,7 @@ Item { anchors.fill: led_light radius: 5 samples: 9 - color: Style.bright_teal + color: Style.content_accent_second source: led_light visible: root.turned_on } diff --git a/ui/view/controls/LogoComponent.qml b/ui/view/controls/LogoComponent.qml index 456387cce..2ff5e222c 100644 --- a/ui/view/controls/LogoComponent.qml +++ b/ui/view/controls/LogoComponent.qml @@ -1,6 +1,7 @@ import QtQuick 2.11 import QtQuick.Controls 2.4 import QtQuick.Layouts 1.4 +import Beam.Wallet 1.0 import "." Component @@ -28,7 +29,7 @@ Component Layout.alignment: Qt.AlignHCenter text: qsTr("BEAM") - color: Style.logo_text_color + color: Style.content_accent_third font.pixelSize: 32 font.styleName: "Bold"; font.weight: Font.Bold font.letterSpacing: 20 @@ -37,9 +38,9 @@ Component Item { - Layout.fillHeight: true - Layout.minimumHeight: 30 - Layout.maximumHeight: 40 + Layout.fillHeight: true + Layout.minimumHeight: 30 + Layout.maximumHeight: 40 } SFText @@ -48,9 +49,37 @@ Component text: qsTr("Scalable confidential cryptocurrency") - color: Style.logo_text_color + color: Style.content_accent_third font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold } + + Item + { + id: stagingLabelAligner + visible: false + Layout.fillHeight: true + Layout.minimumHeight: 30 + Layout.maximumHeight: 40 + } + SFText + { + id: stagingLabel + visible: false + Layout.alignment: Qt.AlignHCenter + color: Style.content_inconspicuous + font.pixelSize: 18 + font.styleName: "Bold"; font.weight: Font.Bold + } + + Component.onCompleted: { + var themeName = Theme.name(); + if (themeName != "mainnet") { + stagingLabelAligner.visible = true; + stagingLabel.text = themeName.toUpperCase(); + stagingLabel.visible = true; + } + + } } } \ No newline at end of file diff --git a/ui/view/controls/PaymentInfoDialog.qml b/ui/view/controls/PaymentInfoDialog.qml index 414f554f3..9e0d7f115 100644 --- a/ui/view/controls/PaymentInfoDialog.qml +++ b/ui/view/controls/PaymentInfoDialog.qml @@ -38,7 +38,7 @@ background: Rectangle { radius: 10 - color: Style.dark_slate_blue + color: Style.background_second anchors.fill: parent } @@ -60,7 +60,7 @@ font.pixelSize: 18 font.styleName: "Bold" font.weight: Font.Bold - color: Style.white + color: Style.content_main text: shouldVerify ? qsTr("Payment proof verification") : qsTr("Payment proof") } @@ -85,7 +85,7 @@ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter opacity: 0.5 font.pixelSize: 14 - color: Style.white + color: Style.content_main text: qsTr("Paste your payment proof here") } @@ -106,7 +106,7 @@ activeFocusOnTab: true font.pixelSize: 14 wrapMode: TextInput.Wrap - color: verifyLayout.isInvalidPaymentProof() ? Style.validator_color : Style.white + color: verifyLayout.isInvalidPaymentProof() ? Style.validator_error : Style.content_main text: model ? model.paymentProof : "" Binding { target: model @@ -128,7 +128,7 @@ font.pixelSize: 14 font.italic: true text: qsTr("Cannot decode a proof, illegal sequence.") - color: Style.validator_color + color: Style.validator_error visible: verifyLayout.isInvalidPaymentProof() } } @@ -138,7 +138,7 @@ font.pixelSize: 14 font.styleName: "Bold" font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Code:") visible: !shouldVerify } @@ -148,7 +148,7 @@ wrapMode: Text.Wrap font.pixelSize: 14 text: model ? model.paymentProof : "" - color: Style.disable_text_color + color: Style.content_disabled visible: !shouldVerify } @@ -159,7 +159,7 @@ font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Details") visible: model? model.isValid : false } @@ -169,7 +169,7 @@ font.pixelSize: 14 font.styleName: "Bold" font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Sender:") visible: model? model.isValid : false } @@ -179,7 +179,7 @@ Layout.preferredHeight: 28 wrapMode: Text.Wrap font.pixelSize: 14 - color: Style.disable_text_color + color: Style.content_disabled text: model ? model.sender : "" verticalAlignment: Text.AlignBottom visible: model? model.isValid : false @@ -190,7 +190,7 @@ font.pixelSize: 14 font.styleName: "Bold" font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Receiver:") visible: model? model.isValid : false } @@ -200,7 +200,7 @@ Layout.preferredHeight: 28 wrapMode: Text.Wrap font.pixelSize: 14 - color: Style.disable_text_color + color: Style.content_disabled text: model ? model.receiver : "" visible: model? model.isValid : false } @@ -210,7 +210,7 @@ font.pixelSize: 14 font.styleName: "Bold" font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Amount:") visible: model? model.isValid : false } @@ -219,7 +219,7 @@ Layout.fillWidth: true wrapMode: Text.Wrap font.pixelSize: 14 - color: Style.disable_text_color + color: Style.content_disabled text: model ? model.amount + " " + qsTr("BEAM") : "" visible: model? model.isValid : false } @@ -229,7 +229,7 @@ font.pixelSize: 14 font.styleName: "Bold" font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Kernel ID:") visible: model? model.isValid : false } @@ -239,7 +239,7 @@ Layout.preferredHeight: 28 wrapMode: Text.Wrap font.pixelSize: 14 - color: Style.disable_text_color + color: Style.content_disabled text: model ? model.kernelID : "" visible: model? model.isValid : false } diff --git a/ui/view/controls/PrimaryButton.qml b/ui/view/controls/PrimaryButton.qml index 288a50068..caa8e9f3c 100644 --- a/ui/view/controls/PrimaryButton.qml +++ b/ui/view/controls/PrimaryButton.qml @@ -4,8 +4,8 @@ import QtQuick.Controls.Styles 1.2 import "." CustomButton { - palette.button: Style.bright_teal - palette.buttonText: Style.marine + palette.button: Style.content_accent_second + palette.buttonText: Style.background SFText { id: text @@ -15,7 +15,7 @@ CustomButton { font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: parent.text visible: false diff --git a/ui/view/controls/SFTextInput.qml b/ui/view/controls/SFTextInput.qml index 3bac1a47b..61bf08f32 100644 --- a/ui/view/controls/SFTextInput.qml +++ b/ui/view/controls/SFTextInput.qml @@ -28,7 +28,7 @@ T.TextField { verticalAlignment: TextInput.AlignVCenter property alias backgroundColor : backgroundRect.color - backgroundColor: Style.white + backgroundColor: Style.content_main selectByMouse: true diff --git a/ui/view/controls/SecondaryPanel.qml b/ui/view/controls/SecondaryPanel.qml index 70ee8f515..23d80c563 100644 --- a/ui/view/controls/SecondaryPanel.qml +++ b/ui/view/controls/SecondaryPanel.qml @@ -12,7 +12,7 @@ Rectangle { property string maturing radius: 10 - color: Style.dark_slate_blue + color: Style.background_second clip: true signal copyValueText(string value) @@ -30,7 +30,7 @@ Rectangle { font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: title } @@ -50,7 +50,7 @@ Rectangle { font.pixelSize: 12 font.styleName: "Normal"; font.weight: Font.Bold - color: Style.white + color: Style.content_main opacity: 0.6 text: qsTr("RECEIVING") } @@ -65,7 +65,7 @@ Rectangle { font.pixelSize: 20 fontSizeMode: Text.Fit minimumPixelSize: 14 - color: Style.bright_sky_blue + color: Style.content_accent_third text: (receiving !== "0") ? "+" + receiving : receiving; elide: Text.ElideRight copyMenuEnabled: true @@ -90,7 +90,7 @@ Rectangle { font.pixelSize: 12 font.styleName: "Normal"; font.weight: Font.Bold - color: Style.white + color: Style.content_main opacity: 0.6 text: qsTr("SENDING") } @@ -105,7 +105,7 @@ Rectangle { font.pixelSize: 20 fontSizeMode: Text.Fit minimumPixelSize: 14 - color: Style.heliotrope + color: Style.content_accent_first text: (sending !== "0") ? "-" + sending : sending; elide: Text.ElideRight copyMenuEnabled: true @@ -130,7 +130,7 @@ Rectangle { font.pixelSize: 12 font.styleName: "Normal"; font.weight: Font.Bold - color: Style.white + color: Style.content_main opacity: 0.6 text: qsTr("MATURING") } @@ -145,7 +145,7 @@ Rectangle { font.pixelSize: 20 fontSizeMode: Text.Fit minimumPixelSize: 14 - color: Style.white + color: Style.content_main text: maturing elide: Text.ElideRight copyMenuEnabled: true diff --git a/ui/view/controls/SecurityNote.qml b/ui/view/controls/SecurityNote.qml index cefe2c8fc..bef679966 100644 --- a/ui/view/controls/SecurityNote.qml +++ b/ui/view/controls/SecurityNote.qml @@ -1,4 +1,4 @@ -import QtQuick 2.11 +import QtQuick 2.11 import QtQuick.Controls 2.4 import QtQuick.Layouts 1.3 import QtGraphicalEffects 1.0 @@ -8,32 +8,32 @@ import "." ColumnLayout { id: secutiryItem property alias iconSource: icon.source - property alias text: label.text - - Item { - Layout.fillWidth: true + property alias text: label.text + + Item { + Layout.fillWidth: true Layout.maximumHeight:76 Layout.minimumHeight:76 SvgImage { id: icon anchors.horizontalCenter: parent.horizontalCenter } - DropShadow { - anchors.fill: icon - radius: 7 - samples: 9 - color: Style.bright_teal - source: icon + DropShadow { + anchors.fill: icon + radius: 7 + samples: 9 + color: Style.content_accent_second + source: icon } - } - - SFText { - Layout.fillHeight: true - Layout.minimumWidth: 200 - Layout.maximumWidth: 200 - id: label + } + + SFText { + Layout.fillHeight: true + Layout.minimumWidth: 200 + Layout.maximumWidth: 200 + id: label horizontalAlignment: Qt.AlignHCenter - color: Style.white + color: Style.content_main font.pixelSize: 14 wrapMode: Text.WordWrap } diff --git a/ui/view/controls/StatusBar.qml b/ui/view/controls/StatusBar.qml index bf4e204eb..0d336c0b2 100644 --- a/ui/view/controls/StatusBar.qml +++ b/ui/view/controls/StatusBar.qml @@ -1,9 +1,9 @@ -import QtQuick 2.11 -import QtQuick.Controls 2.3 -import QtGraphicalEffects 1.0 -import Beam.Wallet 1.0 -import "." - +import QtQuick 2.11 +import QtQuick.Controls 2.3 +import QtGraphicalEffects 1.0 +import Beam.Wallet 1.0 +import "." + Item { id: rootControl x: 5 @@ -42,7 +42,7 @@ Item { anchors.left: parent.left width: childrenRect.width - property color color: Style.bright_teal + property color color: Style.content_accent_second property int radius: rootControl.indicator_radius Rectangle { @@ -73,7 +73,7 @@ Item { anchors.left: parent.left visible: false - property color color: Style.bright_teal + property color color: Style.content_accent_second property int circle_line_width: 2 property int animation_duration: 2000 @@ -108,7 +108,7 @@ Item { anchors.left: parent.indicator.right anchors.leftMargin: 5 anchors.topMargin: -3 - color: Style.bluey_grey + color: Style.content_inconspicuous font.pixelSize: 14 } SFText { @@ -117,7 +117,7 @@ Item { anchors.left: status_text.right anchors.leftMargin: 5 anchors.topMargin: -3 - color: Style.bluey_grey + color: Style.content_inconspicuous font.pixelSize: 14 text: "(" + model.nodeSyncProgress + "%)" visible: model.nodeSyncProgress > 0 && update_indicator.visible @@ -137,15 +137,15 @@ Item { states: [ State { - name: "connecting" - when: (rootControl.status === "connecting") - PropertyChanges {target: status_text; text: qsTr("connecting") + model.branchName} + name: "connecting" + when: (rootControl.status === "connecting") + PropertyChanges {target: status_text; text: qsTr("connecting") + model.branchName} StateChangeScript { name: "connectingScript" script: { rootControl.setIndicator(update_indicator); } - } + } }, State { name: "online" @@ -154,7 +154,7 @@ Item { StateChangeScript { name: "onlineScript" script: { - online_indicator.color = Style.bright_teal; + online_indicator.color = Style.content_accent_second; rootControl.setIndicator(online_indicator); } } diff --git a/ui/view/controls/Style.qml b/ui/view/controls/Style.qml index a0410d681..0e684f8c3 100644 --- a/ui/view/controls/Style.qml +++ b/ui/view/controls/Style.qml @@ -1,31 +1,30 @@ pragma Singleton import QtQuick 2.11 +import Beam.Wallet 1.0 +import "../color_themes" -QtObject { +AbstractColors { - // Color definitions + property var themes: QtObject { + property AbstractColors masternet: Masternet{} + property AbstractColors testnet: Testnet{} + property AbstractColors mainnet: Mainnet{} + } - property color silver: "#d6d9e0" - property color heliotrope: "#da68f5" - property color bright_teal: "#00f6d2" - property color bright_sky_blue: "#0bccf7" - property color dark_slate_blue: "#342e41" - property color white: "#ffffff" - property color navy: "#181223" - property color marine: "#1e172c" - property color light_navy: "#292236" - property color bluey_grey: "#8da1ad" - property color separator_color: "#33566b" - property color disable_text_color: "#889da9" - property color combobox_color: "#0a4b66" - property color validator_color: "#ff625c" - property color general_tx_info_color: "#3e384a" - property color gray_button_color: "#708090" - property color medium_strength_pass_color: "#f4ce4a" - property color strong_pass_color: "#00f6d2" - property color weak_pass_color: "#ff625c" - property color logo_text_color: "#25c1ff" - property color second_line_color: "#879daa" - property color strength_tests_msg_color : "#84a5b2" - property color table_row_color1: "#332d40" + + Component.onCompleted: { + var currentTheme = themes[Theme.name()] + if (!currentTheme) { + currentTheme = themes['masternet']; + } + + for (var propName in this) { + if (typeof this[propName] != "function" + && propName != "objectName" + && propName != "themes") { + this[propName] = currentTheme[propName] + } + + } + } } diff --git a/ui/view/controls/TableItem.qml b/ui/view/controls/TableItem.qml index 5064ca74e..9a763a04b 100644 --- a/ui/view/controls/TableItem.qml +++ b/ui/view/controls/TableItem.qml @@ -16,7 +16,7 @@ Item { anchors.right: parent.right anchors.leftMargin: 20 font.pixelSize: 14 - color: Style.white + color: Style.content_main } clip:true diff --git a/ui/view/controls/TransactionDetails.qml b/ui/view/controls/TransactionDetails.qml index dc0d9d728..4313c0753 100644 --- a/ui/view/controls/TransactionDetails.qml +++ b/ui/view/controls/TransactionDetails.qml @@ -24,7 +24,7 @@ RowLayout { SFText { font.pixelSize: 14 - color: Style.white + color: Style.content_main text: qsTr("General transaction info") font.styleName: "Bold"; font.weight: Font.Bold Layout.columnSpan: 2 @@ -33,14 +33,14 @@ RowLayout { SFText { Layout.alignment: Qt.AlignTop font.pixelSize: 14 - color: Style.bluey_grey + color: Style.content_inconspicuous text: qsTr("Sending address:") } SFLabel { Layout.fillWidth: true copyMenuEnabled: true font.pixelSize: 14 - color: Style.white + color: Style.content_main //wrapMode: Text.Wrap elide: Text.ElideMiddle text: { @@ -52,14 +52,14 @@ RowLayout { SFText { Layout.alignment: Qt.AlignTop font.pixelSize: 14 - color: Style.bluey_grey + color: Style.content_inconspicuous text: qsTr("Receiving address:") } SFLabel { Layout.fillWidth: true copyMenuEnabled: true font.pixelSize: 14 - color: Style.white + color: Style.content_main //wrapMode: Text.Wrap elide: Text.ElideMiddle text: { @@ -71,14 +71,14 @@ RowLayout { SFText { Layout.alignment: Qt.AlignTop font.pixelSize: 14 - color: Style.bluey_grey + color: Style.content_inconspicuous text: qsTr("Transaction fee:") } SFLabel { Layout.fillWidth: true copyMenuEnabled: true font.pixelSize: 14 - color: Style.white + color: Style.content_main text:{ return model ? model.fee : ""; } @@ -88,7 +88,7 @@ RowLayout { SFText { Layout.alignment: Qt.AlignTop font.pixelSize: 14 - color: Style.bluey_grey + color: Style.content_inconspicuous text: qsTr("Comment:") } SFLabel { @@ -96,7 +96,7 @@ RowLayout { id: commentTx copyMenuEnabled: true font.pixelSize: 14 - color: Style.white + color: Style.content_main wrapMode: Text.Wrap text: { return model ? model.comment : ""; @@ -108,7 +108,7 @@ RowLayout { SFText { Layout.alignment: Qt.AlignTop font.pixelSize: 14 - color: Style.bluey_grey + color: Style.content_inconspicuous text: qsTr("Kernel ID:") } SFLabel { @@ -116,7 +116,7 @@ RowLayout { id: kernelID copyMenuEnabled: true font.pixelSize: 14 - color: Style.white + color: Style.content_main //wrapMode: Text.Wrap text: model ? model.kernelID : "" font.styleName: "Italic" @@ -126,7 +126,7 @@ RowLayout { SFText { Layout.alignment: Qt.AlignTop font.pixelSize: 14 - color: Style.bluey_grey + color: Style.content_inconspicuous text: qsTr("Error: ") visible: model ? model.failureReason.length > 0 : false } @@ -135,7 +135,7 @@ RowLayout { Layout.fillWidth: true copyMenuEnabled: true font.pixelSize: 14 - color: Style.white + color: Style.content_main wrapMode: Text.Wrap visible: model ? model.failureReason.length > 0 : false text: { @@ -170,7 +170,7 @@ RowLayout { } SFText { font.pixelSize: 14 - color: Style.white + color: Style.content_main text: qsTr("Payment proof") font.styleName: "Bold"; font.weight: Font.Bold Layout.columnSpan: 2 diff --git a/ui/view/controls/TxFilter.qml b/ui/view/controls/TxFilter.qml index cefe030f4..6d8ed3ec9 100644 --- a/ui/view/controls/TxFilter.qml +++ b/ui/view/controls/TxFilter.qml @@ -23,7 +23,7 @@ Item { font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main opacity: 0.4 text: label @@ -43,7 +43,7 @@ Item { width: text_label.width + 16 height: 2 - color: Style.bright_teal + color: Style.content_accent_second visible: false } @@ -52,7 +52,7 @@ Item { anchors.fill: led radius: 5 samples: 9 - color: Style.bright_teal + color: Style.content_accent_second source: led visible: led.visible diff --git a/ui/view/dashboard.qml b/ui/view/dashboard.qml index 4ce6454b7..160b34baa 100644 --- a/ui/view/dashboard.qml +++ b/ui/view/dashboard.qml @@ -5,12 +5,12 @@ import QtQuick.Controls.Styles 1.2 Rectangle { anchors.fill: parent - color: Style.marine + color: Style.background Text { anchors.centerIn: parent font.pixelSize: 40 - color: Style.white + color: Style.content_main text: "Welcome to Beam Testnet" } } diff --git a/ui/view/info.qml b/ui/view/info.qml index 2054289a8..84a1d3f06 100644 --- a/ui/view/info.qml +++ b/ui/view/info.qml @@ -5,12 +5,12 @@ import QtQuick.Controls.Styles 1.2 Rectangle { anchors.fill: parent - color: Style.marine + color: Style.background Text { anchors.centerIn: parent font.pixelSize: 40 - color: Style.white + color: Style.content_main text: qsTr("Info view") } } diff --git a/ui/view/loading.qml b/ui/view/loading.qml index 7cd5abd79..82d86ee40 100644 --- a/ui/view/loading.qml +++ b/ui/view/loading.qml @@ -17,7 +17,7 @@ Item ConfirmationDialog { id: confirmationDialog - okButtonColor: Style.bright_teal + okButtonColor: Style.content_accent_second okButtonText: qsTr("change settings") okButtonIconSource: "qrc:/assets/icon-settings-blue.svg" cancelButtonIconSource: "qrc:/assets/icon-cancel-white.svg" @@ -41,7 +41,7 @@ Item font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main } SFText { @@ -52,7 +52,7 @@ Item Layout.rightMargin: 60 Layout.bottomMargin: 30 font.pixelSize: 14 - color: Style.white + color: Style.content_main } } } @@ -65,9 +65,9 @@ Item id: viewModel onSyncCompleted: { if (isRecoveryMode || isCreating) - root.parent.source = "qrc:/main.qml"; - else - rootLoading.parent.source = "qrc:/main.qml"; + root.parent.source = "qrc:/main.qml"; + else + rootLoading.parent.source = "qrc:/main.qml"; } onWalletError: { @@ -80,33 +80,33 @@ Item } function cancelCreating() { - viewModel.resetWallet(); + viewModel.resetWallet(); cancelCallback(); } LogoComponent { - id: logoComponent + id: logoComponent } - Rectangle - { - anchors.fill: parent - color: Style.marine - - Image { - fillMode: Image.PreserveAspectCrop - anchors.fill: parent - source: "qrc:/assets/bg.svg" - } - + Rectangle + { + anchors.fill: parent + color: Style.background + + Image { + fillMode: Image.PreserveAspectCrop + anchors.fill: parent + source: "qrc:/assets/bg.svg" + } + ColumnLayout { anchors.fill: parent spacing: 0 Item { - Layout.fillHeight: true - Layout.fillWidth: true - Layout.minimumHeight: 70 - Layout.maximumHeight: 280 + Layout.fillHeight: true + Layout.fillWidth: true + Layout.minimumHeight: 70 + Layout.maximumHeight: 280 } Loader { @@ -117,84 +117,84 @@ Item Layout.maximumHeight: 269 } Item { - Layout.fillHeight: true - Layout.minimumHeight: 30 - Layout.maximumHeight: 89 - + Layout.fillHeight: true + Layout.minimumHeight: 30 + Layout.maximumHeight: 89 + } Item { - Layout.preferredHeight: 186 + Layout.preferredHeight: 186 } Item { - Layout.fillHeight: true - Layout.fillWidth: true - Layout.minimumHeight: 67 - } - } - - ColumnLayout { - anchors.fill: parent - spacing: 0 - Item { - Layout.fillHeight: true - Layout.minimumHeight: 70 - Layout.maximumHeight: 280 - } - - Item { - Layout.fillHeight: true - Layout.minimumHeight: 200//187 - Layout.maximumHeight: 269 - } - + Layout.fillHeight: true + Layout.fillWidth: true + Layout.minimumHeight: 67 + } + } + + ColumnLayout { + anchors.fill: parent + spacing: 0 Item { - Layout.fillHeight: true - Layout.minimumHeight: 30 - Layout.maximumHeight: 89 - } - SFText { - Layout.bottomMargin: 6 - Layout.alignment: Qt.AlignHCenter | Qt.AlignTop - text: !isCreating ? qsTr("Loading wallet...") : ( isRecoveryMode ? qsTr("Restoring wallet...") : qsTr("Creating wallet...")) - font.pixelSize: 14 - color: Style.white - } - SFText { - Layout.bottomMargin: 30 - Layout.alignment: Qt.AlignHCenter | Qt.AlignTop - text: viewModel.progressMessage - font.pixelSize: 14 - opacity: 0.5 - color: Style.white - } - CustomProgressBar { - Layout.alignment: Qt.AlignHCenter - id: bar - value: viewModel.progress - } - - Item { - Layout.fillHeight: true - } - - Row { - Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - Layout.topMargin: 52 - - CustomButton { - visible: isCreating - text: qsTr("cancel") - icon.source: "qrc:/assets/icon-cancel.svg" - onClicked: { - cancelCreating(); - } - } - } - Item { - Layout.fillHeight: true - Layout.minimumHeight: 67 - } - } + Layout.fillHeight: true + Layout.minimumHeight: 70 + Layout.maximumHeight: 280 + } + + Item { + Layout.fillHeight: true + Layout.minimumHeight: 200//187 + Layout.maximumHeight: 269 + } + + Item { + Layout.fillHeight: true + Layout.minimumHeight: 30 + Layout.maximumHeight: 89 + } + SFText { + Layout.bottomMargin: 6 + Layout.alignment: Qt.AlignHCenter | Qt.AlignTop + text: !isCreating ? qsTr("Loading wallet...") : ( isRecoveryMode ? qsTr("Restoring wallet...") : qsTr("Creating wallet...")) + font.pixelSize: 14 + color: Style.content_main + } + SFText { + Layout.bottomMargin: 30 + Layout.alignment: Qt.AlignHCenter | Qt.AlignTop + text: viewModel.progressMessage + font.pixelSize: 14 + opacity: 0.5 + color: Style.content_main + } + CustomProgressBar { + Layout.alignment: Qt.AlignHCenter + id: bar + value: viewModel.progress + } + + Item { + Layout.fillHeight: true + } + + Row { + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + Layout.topMargin: 52 + + CustomButton { + visible: isCreating + text: qsTr("cancel") + icon.source: "qrc:/assets/icon-cancel.svg" + onClicked: { + cancelCreating(); + } + } + } + Item { + Layout.fillHeight: true + Layout.minimumHeight: 67 + } + } } } \ No newline at end of file diff --git a/ui/view/main.qml b/ui/view/main.qml index 712cb972e..09fed8cda 100644 --- a/ui/view/main.qml +++ b/ui/view/main.qml @@ -14,10 +14,10 @@ Rectangle { MainViewModel {id: viewModel} StatusbarViewModel { - id: statusbarModel + id: statusbarModel } - color: Style.marine + color: Style.background MouseArea { id: mainMouseArea @@ -47,7 +47,7 @@ Rectangle { id: sidebar width: 70 height: 0 - color: Style.navy + color: Style.navigation_bar_background border.width: 0 anchors.bottom: parent.bottom anchors.left: parent.left @@ -87,22 +87,22 @@ Rectangle { y: 6 width: 4 height: 48 - color: selectedItem == index ? Style.bright_teal : Style.silver + color: selectedItem == index ? Style.navigation_bar_active : Style.navigation_bar_passive } DropShadow { anchors.fill: indicator radius: 5 samples: 9 - color: Style.bright_teal + color: Style.navigation_bar_shadow source: indicator } visible: control.activeFocus } - Keys.onPressed: { - if ((event.key == Qt.Key_Return || event.key == Qt.Key_Enter || event.key == Qt.Key_Space) && selectedItem != index) - updateItem(index); + Keys.onPressed: { + if ((event.key == Qt.Key_Return || event.key == Qt.Key_Enter || event.key == Qt.Key_Space) && selectedItem != index) + updateItem(index); } MouseArea { diff --git a/ui/view/notification.qml b/ui/view/notification.qml index fc0f1059d..42bd20969 100644 --- a/ui/view/notification.qml +++ b/ui/view/notification.qml @@ -5,12 +5,12 @@ import QtQuick.Controls.Styles 1.2 Rectangle { anchors.fill: parent - color: Style.marine + color: Style.background Text { anchors.centerIn: parent font.pixelSize: 40 - color: Style.white + color: Style.content_main text: qsTr("Notifications view") } } diff --git a/ui/view/qml.qrc b/ui/view/qml.qrc index 8d59092cd..6384ae9ae 100644 --- a/ui/view/qml.qrc +++ b/ui/view/qml.qrc @@ -1,5 +1,9 @@ + color_themes/AbstractColors.qml + color_themes/Mainnet.qml + color_themes/Masternet.qml + color_themes/Testnet.qml controls/Style.qml controls/qmldir controls/SvgImage.qml @@ -53,6 +57,8 @@ assets/logo.svg assets/start-logo.svg assets/icon.png + assets/icon_masternet.png + assets/icon_testnet.png assets/bg.svg assets/b-grey.svg assets/icon-dashboard.svg diff --git a/ui/view/root.qml b/ui/view/root.qml index c585caa7b..f99858b2b 100644 --- a/ui/view/root.qml +++ b/ui/view/root.qml @@ -15,7 +15,7 @@ Window { Popup { id: notifications closePolicy: Popup.NoAutoClose - palette.window : Style.marine + palette.window : Style.background MessagesViewModel {id: viewModel} parent: Overlay.overlay @@ -50,7 +50,7 @@ Window { Layout.alignment: Qt.AlignVCenter text: modelData font.pixelSize: 14 - color: Style.white + color: Style.content_main height: 16 } CustomToolButton { diff --git a/ui/view/settings.qml b/ui/view/settings.qml index 4652ca01d..5863dbcab 100644 --- a/ui/view/settings.qml +++ b/ui/view/settings.qml @@ -9,7 +9,7 @@ import Beam.Wallet 1.0 Rectangle { anchors.fill: parent - color: Style.marine + color: Style.background SettingsViewModel {id: viewModel} @@ -32,7 +32,7 @@ Rectangle { Layout.fillWidth: true Layout.alignment: Qt.AlignTop font.pixelSize: 36 - color: Style.white + color: Style.content_main text: "Settings" } @@ -41,7 +41,7 @@ Rectangle { Layout.alignment: Qt.AlignBottom | Qt.AlignRight horizontalAlignment: Text.AlignRight font.pixelSize: 14 - color: Style.white + color: Style.content_main text: "Version: " + viewModel.version } } @@ -67,7 +67,7 @@ Rectangle { height: 150 radius: 10 - color: Style.dark_slate_blue + color: Style.background_second ColumnLayout { anchors.fill: parent @@ -78,7 +78,7 @@ Rectangle { Layout.alignment: Qt.AlignTop Layout.bottomMargin: 15 text: qsTr("Remote node") - color: Style.white + color: Style.content_main font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold } @@ -86,7 +86,7 @@ Rectangle { SFText { Layout.alignment: Qt.AlignTop text: qsTr("ip:port") - color: localNodeRun.checked ? Style.disable_text_color : Style.white + color: localNodeRun.checked ? Style.content_disabled : Style.content_main font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold } @@ -98,7 +98,7 @@ Rectangle { focus: true activeFocusOnTab: true font.pixelSize: 12 - color: readOnly ? Style.disable_text_color : Style.white + color: readOnly ? Style.content_disabled : Style.content_main readOnly: localNodeRun.checked validator: RegExpValidator { regExp: /^(\s|\x180E)*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])|([\w.-]+(?:\.[\w\.-]+)+))(:([0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?(\s|\x180E)*$/ } text: viewModel.nodeAddress @@ -114,7 +114,7 @@ Rectangle { SFText { Layout.alignment: Qt.AlignTop id: nodeAddressError - color: Style.validator_color + color: Style.validator_error font.pixelSize: 10 visible: !nodeAddress.acceptableInput text: "Invalid address" @@ -128,7 +128,7 @@ Rectangle { Layout.alignment: Qt.AlignTop height: 320 radius: 10 - color: Style.dark_slate_blue + color: Style.background_second ColumnLayout { anchors.fill: parent @@ -136,7 +136,7 @@ Rectangle { SFText { text: qsTr("Local node") - color: Style.white + color: Style.content_main font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold } @@ -166,7 +166,7 @@ Rectangle { SFText { text: qsTr("Local node port") - color: localNodeRun.checked ? Style.white : Style.disable_text_color + color: localNodeRun.checked ? Style.content_main : Style.content_disabled font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold } @@ -176,7 +176,7 @@ Rectangle { width: parent.width activeFocusOnTab: true font.pixelSize: 12 - color: readOnly ? Style.disable_text_color : Style.white + color: readOnly ? Style.content_disabled : Style.content_main readOnly: !localNodeRun.checked text: viewModel.localNodePort validator: IntValidator { @@ -199,7 +199,7 @@ Rectangle { SFText { Layout.topMargin: 5 text: qsTr("Peers") - color: localNodeRun.checked ? Style.white : Style.disable_text_color + color: localNodeRun.checked ? Style.content_main : Style.content_disabled font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold } @@ -214,7 +214,7 @@ Rectangle { width: parent.width activeFocusOnTab: true font.pixelSize: 12 - color: readOnly ? Style.disable_text_color : Style.white + color: readOnly ? Style.content_disabled : Style.content_main readOnly: !localNodeRun.checked validator: RegExpValidator { regExp: /^(\s|\x180E)*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])|([\w.-]+(?:\.[\w\.-]+)+))(:([0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?(\s|\x180E)*$/ } } @@ -225,8 +225,8 @@ Rectangle { leftPadding: 20 rightPadding: 20 text: "Add" - palette.button: Style.gray_button_color - palette.buttonText : localNodeRun.checked ? Style.white : Style.disable_text_color + palette.button: Style.background_inconspicuous + palette.buttonText : localNodeRun.checked ? Style.content_main : Style.content_disabled enabled: newLocalNodePeer.acceptableInput && localNodeRun.checked onClicked: { viewModel.addLocalNodePeer(newLocalNodePeer.text.trim()); @@ -237,7 +237,7 @@ Rectangle { SFText { text: qsTr("Please add at least one peer") - color: Style.validator_color + color: Style.validator_error font.pixelSize: 14 fontSizeMode: Text.Fit minimumPixelSize: 10 @@ -261,7 +261,7 @@ Rectangle { Layout.alignment: Qt.AlignVCenter text: modelData font.pixelSize: 12 - color: Style.white + color: Style.content_main height: 16 elide: Text.ElideRight } @@ -308,7 +308,7 @@ Rectangle { width: parent.width topPadding: 20 font.pixelSize: 18 - color: Style.white + color: Style.content_main horizontalAlignment : Text.AlignHCenter text: qsTr("Rescan") } @@ -317,7 +317,7 @@ Rectangle { leftPadding: 20 rightPadding: 20 font.pixelSize: 14 - color: Style.white + color: Style.content_main wrapMode: Text.Wrap horizontalAlignment : Text.AlignHCenter text: qsTr("Rescan will sync transaction and UTXO data with the latest information on the blockchain. The process might take long time. \n\nAre you sure?") @@ -340,7 +340,7 @@ Rectangle { Rectangle { Layout.fillWidth: true radius: 10 - color: Style.dark_slate_blue + color: Style.background_second //height: childrenRect.height + 40 height: 150 @@ -353,7 +353,7 @@ Rectangle { SFText { text: qsTr("General settings") - color: Style.white + color: Style.content_main font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold } @@ -365,7 +365,7 @@ Rectangle { SFText { text: qsTr("Lock screen in") - color: Style.white + color: Style.content_main font.pixelSize: 12 } @@ -392,7 +392,7 @@ Rectangle { CustomButton { text: "change wallet password" palette.buttonText : "white" - palette.button: Style.gray_button_color + palette.button: Style.background_inconspicuous icon.source: "qrc:/assets/icon-password.svg" icon.width: 16 icon.height: 16 @@ -405,7 +405,7 @@ Rectangle { Layout.fillWidth: true height: 320 radius: 10 - color: Style.dark_slate_blue + color: Style.background_second ColumnLayout { anchors.fill: parent @@ -414,7 +414,7 @@ Rectangle { SFText { text: qsTr("Report problem") - color: Style.white + color: Style.content_main font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold } @@ -423,7 +423,7 @@ Rectangle { SFText { Layout.fillWidth: true text: qsTr("To report a problem:") - color: Style.white + color: Style.content_main font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold wrapMode: Text.WordWrap @@ -432,7 +432,7 @@ Rectangle { SFText { Layout.fillWidth: true text: qsTr("1. Click 'Save wallet logs' and choose a destination folder for log archive") - color: Style.white + color: Style.content_main font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold wrapMode: Text.WordWrap @@ -441,7 +441,7 @@ Rectangle { SFText { Layout.fillWidth: true text: qsTr("2. Send email to support@beam.mw or open a ticket in github") - color: Style.white + color: Style.content_main textFormat: Text.RichText font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold @@ -458,7 +458,7 @@ Rectangle { SFText { Layout.fillWidth: true text: qsTr("3. Don't forget to attach logs archive") - color: Style.white + color: Style.content_main font.pixelSize: 12 font.styleName: "Bold"; font.weight: Font.Bold wrapMode: Text.WordWrap @@ -469,7 +469,7 @@ Rectangle { CustomButton { text: "save wallet logs" palette.buttonText : "white" - palette.button: Style.gray_button_color + palette.button: Style.background_inconspicuous onClicked: viewModel.reportProblem() } spacing: 30 @@ -477,8 +477,8 @@ Rectangle { icon.source: "qrc:/assets/icon-restore.svg" Layout.alignment: Qt.AlignRight text: qsTr("rescan") - palette.button: Style.gray_button_color - palette.buttonText : localNodeRun.checked ? Style.white : Style.disable_text_color + palette.button: Style.background_inconspicuous + palette.buttonText : localNodeRun.checked ? Style.content_main : Style.content_disabled enabled: localNodeRun.checked && confirmRefreshDialog.canRefresh && viewModel.isLocalNodeRunning onClicked: { confirmRefreshDialog.open(); @@ -491,7 +491,7 @@ Rectangle { Layout.fillWidth: true Layout.minimumHeight: 20 text: qsTr("Wallet folder location:") - color: Style.white + color: Style.content_main font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold wrapMode: Text.WordWrap @@ -501,16 +501,16 @@ Rectangle { Layout.fillWidth: true font.pixelSize: 14 - color: Style.disable_text_color + color: Style.content_disabled readOnly: true activeFocusOnTab: false text: viewModel.walletLocation } CustomButton { text: qsTr("copy") - icon.color: Style.white - palette.buttonText : Style.white - palette.button: Style.gray_button_color + icon.color: Style.content_main + palette.buttonText : Style.content_main + palette.button: Style.background_inconspicuous icon.source: "qrc:/assets/icon-copy.svg" onClicked: { viewModel.copyToClipboard(viewModel.walletLocation); diff --git a/ui/view/start.qml b/ui/view/start.qml index c9037dca2..66308a3ab 100644 --- a/ui/view/start.qml +++ b/ui/view/start.qml @@ -17,7 +17,7 @@ Item StartViewModel { id: viewModel } LogoComponent { - id: logoComponent + id: logoComponent } StackView { @@ -34,7 +34,7 @@ Item id: start Rectangle { - color: Style.marine + color: Style.background Image { fillMode: Image.PreserveAspectCrop @@ -45,8 +45,8 @@ Item property Item defaultFocusItem: createNewWallet ConfirmationDialog { - id: restoreWalletConfirmation - + id: restoreWalletConfirmation + okButtonText: qsTr("restore wallet") okButtonIconSource: "qrc:/assets/icon-restore-blue.svg" cancelVisible: true @@ -59,40 +59,40 @@ Item anchors.margins: 30 spacing: 20 - SFText { - horizontalAlignment : Text.AlignHCenter - width: parent.width - text: qsTr("Your funds will be fully restored from the blockchain. The transaction history and your addresses are stored locally and are encrypted with your password, hence it can't be restored.") - color: Style.white - font.pixelSize: 14 - wrapMode: Text.Wrap - } - - SFText { - horizontalAlignment : Text.AlignHCenter - width: parent.width - text: qsTr("That's the final version till the future validation and process.") - color: Style.white - font.pixelSize: 14 - wrapMode: Text.Wrap - } + SFText { + horizontalAlignment : Text.AlignHCenter + width: parent.width + text: qsTr("Your funds will be fully restored from the blockchain. The transaction history and your addresses are stored locally and are encrypted with your password, hence it can't be restored.") + color: Style.content_main + font.pixelSize: 14 + wrapMode: Text.Wrap + } + + SFText { + horizontalAlignment : Text.AlignHCenter + width: parent.width + text: qsTr("That's the final version till the future validation and process.") + color: Style.content_main + font.pixelSize: 14 + wrapMode: Text.Wrap + } } onAccepted: { onClicked: { - viewModel.isRecoveryMode = true; - startWizzardView.push(restoreWallet); + viewModel.isRecoveryMode = true; + startWizzardView.push(restoreWallet); } - } + } } ColumnLayout { anchors.fill: parent spacing: 0 Item { - Layout.fillHeight: true - Layout.fillWidth: true - Layout.minimumHeight: 100 - Layout.maximumHeight: 280 + Layout.fillHeight: true + Layout.fillWidth: true + Layout.minimumHeight: 100 + Layout.maximumHeight: 280 } Loader { @@ -104,9 +104,9 @@ Item } Item { - Layout.fillHeight: true + Layout.fillHeight: true Layout.minimumHeight: 122 - Layout.maximumHeight: 237 + Layout.maximumHeight: 237 } Row { @@ -130,15 +130,15 @@ Item CustomButton { text: qsTr("restore wallet") icon.source: "qrc:/assets/icon-restore.svg" - onClicked: { - restoreWalletConfirmation.open(); - } + onClicked: { + restoreWalletConfirmation.open(); + } } } Item { - Layout.fillHeight: true - Layout.minimumHeight: 67 + Layout.fillHeight: true + Layout.minimumHeight: 67 } } } @@ -148,7 +148,7 @@ Item id: migrate Rectangle { - color: Style.marine + color: Style.background Image { fillMode: Image.PreserveAspectCrop @@ -162,10 +162,10 @@ Item anchors.fill: parent spacing: 0 Item { - Layout.fillHeight: true - Layout.fillWidth: true - Layout.minimumHeight: 100 - Layout.maximumHeight: 280 + Layout.fillHeight: true + Layout.fillWidth: true + Layout.minimumHeight: 100 + Layout.maximumHeight: 280 } Loader { @@ -177,21 +177,21 @@ Item } Item { - Layout.preferredHeight: 30 + Layout.preferredHeight: 30 } SFText { Layout.alignment: Qt.AlignHCenter text: qsTr("Your wallet will be migrated to v.") + viewModel.walletVersion() - color: Style.white + color: Style.content_main font.pixelSize: 14 } Item { - Layout.fillHeight: true + Layout.fillHeight: true Layout.minimumHeight: 30 - Layout.maximumHeight: 67 + Layout.maximumHeight: 67 } PrimaryButton { @@ -208,15 +208,15 @@ Item } Item { - Layout.fillHeight: true - Layout.minimumHeight: 30 - Layout.maximumHeight: 65 + Layout.fillHeight: true + Layout.minimumHeight: 30 + Layout.maximumHeight: 65 } SFText { Layout.alignment: Qt.AlignHCenter text: qsTr("Login to another wallet or create new one") - color: Style.bright_teal + color: Style.content_accent_second font.pixelSize: 14 MouseArea { @@ -231,8 +231,8 @@ Item } Item { - Layout.fillHeight: true - Layout.minimumHeight: 30 + Layout.fillHeight: true + Layout.minimumHeight: 30 } } } @@ -242,7 +242,7 @@ Item id: selectWalletDBView Rectangle { - color: Style.marine + color: Style.background ColumnLayout { anchors.fill: parent anchors.topMargin: 50 @@ -251,7 +251,7 @@ Item Layout.alignment: Qt.AlignHCenter horizontalAlignment: Qt.AlignHCenter text: qsTr("Select the wallet database file") - color: Style.white + color: Style.content_main font.pixelSize: 36 } @@ -265,9 +265,9 @@ Item Layout.bottomMargin: 9 Layout.fillWidth: true Layout.fillHeight: true - Layout.minimumHeight: headerHeight + 3*rowHeight + Layout.minimumHeight: headerHeight + 3*rowHeight Layout.maximumHeight: headerHeight + 5*rowHeight - Layout.minimumWidth: minWidth + Layout.minimumWidth: minWidth Layout.maximumWidth: minWidth frameVisible: false @@ -275,20 +275,20 @@ Item backgroundVisible: false model: viewModel.walletDBpaths - headerDelegate: Rectangle { - height: tableView.headerHeight - color: Style.dark_slate_blue - - SFLabel { - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - anchors.leftMargin: tableView.textLeftMargin - horizontalAlignment: Qt.AlignHCenter - font.pixelSize: tableView.headerTextFontSize - color: Style.bluey_grey - font.weight: Font.Normal - text: styleData.value - } + headerDelegate: Rectangle { + height: tableView.headerHeight + color: Style.background_second + + SFLabel { + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: tableView.textLeftMargin + horizontalAlignment: Qt.AlignHCenter + font.pixelSize: tableView.headerTextFontSize + color: Style.content_inconspicuous + font.weight: Font.Normal + text: styleData.value + } } TableViewColumn { @@ -309,7 +309,7 @@ Item elide: Text.ElideLeft anchors.verticalCenter: parent.verticalCenter text: styleData.value - color: Style.white + color: Style.content_main copyMenuEnabled: true onCopyText: viewModel.copyToClipboard(text) } @@ -333,7 +333,7 @@ Item anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter text: Math.round(styleData.value / 1024) + qsTr(" kb") - color: Style.white + color: Style.content_main } } } @@ -352,7 +352,7 @@ Item Rectangle { anchors.fill: parent - color: styleData.selected ? "#085469" : Style.light_navy + color: styleData.selected ? "#085469" : Style.background_third visible: styleData.alternate || styleData.selected } } @@ -368,14 +368,14 @@ Item anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter text: styleData.value - color: Style.white + color: Style.content_main } } } Item { - Layout.fillHeight: true - Layout.minimumHeight: 64 + Layout.fillHeight: true + Layout.minimumHeight: 64 } Row { @@ -422,15 +422,15 @@ Item } Item { - Layout.fillHeight: true - Layout.minimumHeight: 30 - Layout.maximumHeight: 65 + Layout.fillHeight: true + Layout.minimumHeight: 30 + Layout.maximumHeight: 65 } SFText { Layout.alignment: Qt.AlignHCenter text: qsTr("Login to another wallet or create new one") - color: Style.bright_teal + color: Style.content_accent_second font.pixelSize: 14 MouseArea { @@ -445,9 +445,9 @@ Item } Item { - Layout.fillHeight: true - Layout.minimumHeight: 60 - Layout.maximumHeight: 90 + Layout.fillHeight: true + Layout.minimumHeight: 60 + Layout.maximumHeight: 90 } } } @@ -457,13 +457,13 @@ Item id: createWalletEntry Rectangle { - color: Style.marine + color: Style.background property Item defaultFocusItem: generateRecoveryPhraseButton ColumnLayout { anchors.horizontalCenter: parent.horizontalCenter anchors.fill: parent - anchors.topMargin: 50 + anchors.topMargin: 50 Column { spacing: 30 Layout.alignment: Qt.AlignHCenter | Qt.AlignTop @@ -471,18 +471,18 @@ Item anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Qt.AlignHCenter text: qsTr("Create new wallet") - color: Style.white + color: Style.content_main font.pixelSize: 36 } SFText { anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Qt.AlignHCenter - text: qsTr("Create new wallet with generating seed phrase. + text: qsTr("Create new wallet with generating seed phrase. If you ever lose your device, you will need this phrase to recover your wallet!") - color: Style.white + color: Style.content_main wrapMode: Text.WordWrap font.pixelSize: 14 - } + } } Row { @@ -493,15 +493,15 @@ Item Layout.maximumHeight: 500 SecurityNote{ iconSource: "qrc:/assets/eye.svg" - text: qsTr("Do not let anyone see your seed phrase"); + text: qsTr("Do not let anyone see your seed phrase"); } SecurityNote{ iconSource: "qrc:/assets/password.svg" - text: qsTr("Never type your seed phrase into password managers or elsewhere"); + text: qsTr("Never type your seed phrase into password managers or elsewhere"); } SecurityNote{ iconSource: "qrc:/assets/copy-two-paper-sheets-interface-symbol.svg" - text: qsTr("Keep the copies of your seed phrase in a safe place"); + text: qsTr("Keep the copies of your seed phrase in a safe place"); } } @@ -540,13 +540,13 @@ Item Component { id: generateRecoveryPhrase Rectangle { - color: Style.marine + color: Style.background property Item defaultFocusItem: nextButton ColumnLayout { anchors.horizontalCenter: parent.horizontalCenter anchors.fill: parent - anchors.topMargin: 50 + anchors.topMargin: 50 Column { spacing: 30 Layout.alignment: Qt.AlignHCenter | Qt.AlignTop @@ -555,7 +555,7 @@ Item anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Qt.AlignHCenter text: qsTr("Create new wallet") - color: Style.white + color: Style.content_main font.pixelSize: 36 } SFText { @@ -563,10 +563,10 @@ Item anchors.right: parent.right horizontalAlignment: Qt.AlignHCenter text: qsTr("Your seed phrase is the access key to all the cryptocurrencies in your wallet. Write down the phrase to keep it in a safe or in a locked vault. Without the phrase you will not be able to recover your money.") - color: Style.white + color: Style.content_main wrapMode: Text.WordWrap font.pixelSize: 14 - } + } } ConfirmationDialog { id: confirRecoveryPhrasesDialog @@ -590,37 +590,37 @@ Item Repeater { model:viewModel.recoveryPhrases Rectangle{ - border.color: Style.dark_slate_blue - color: "transparent" - width: 160 - height: 38 - radius: 30 + border.color: Style.background_second + color: "transparent" + width: 160 + height: 38 + radius: 30 Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.leftMargin: 9 anchors.left: parent.left - color: Style.dark_slate_blue - width: 20 - height: 20 - radius: 10 - SFText { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - text: modelData.index + 1 - font.pixelSize: 10 - color: Style.white - opacity: 0.5 - } - } - SFText { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - text: modelData.phrase - font.pixelSize: 14 - color: Style.white - } + color: Style.background_second + width: 20 + height: 20 + radius: 10 + SFText { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + text: modelData.index + 1 + font.pixelSize: 10 + color: Style.content_main + opacity: 0.5 + } + } + SFText { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + text: modelData.phrase + font.pixelSize: 14 + color: Style.content_main + } } - } + } } Item { @@ -668,13 +668,13 @@ Item Component { id: checkRecoveryPhrase Rectangle { - color: Style.marine + color: Style.background property Item defaultFocusItem: null ColumnLayout { anchors.horizontalCenter: parent.horizontalCenter anchors.fill: parent - anchors.topMargin: 50 + anchors.topMargin: 50 Column { spacing: 30 Layout.alignment: Qt.AlignHCenter | Qt.AlignTop @@ -683,7 +683,7 @@ Item anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Qt.AlignHCenter text: qsTr("Create new wallet") - color: Style.white + color: Style.content_main font.pixelSize: 36 } SFText { @@ -691,10 +691,10 @@ Item anchors.right: parent.right horizontalAlignment: Qt.AlignHCenter text: qsTr("To ensure the seed phrase is written down, please fill-in the specific words below") - color: Style.white + color: Style.content_main wrapMode: Text.WordWrap font.pixelSize: 14 - } + } } Grid{ @@ -708,54 +708,54 @@ Item model:viewModel.checkPhrases Row { - width: 160 + width: 160 height: 38 spacing: 20 Item { anchors.verticalCenter: parent.verticalCenter anchors.leftMargin: 9 - width: 20 + width: 20 height: 20 Rectangle { - color: "transparent" - border.color: Style.bluey_grey - width: 20 - height: 20 - radius: 10 - SFText { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - text: modelData.index + 1 - font.pixelSize: 10 - color: Style.bluey_grey - } - visible: modelData.value.length == 0 - } - + color: "transparent" + border.color: Style.content_inconspicuous + width: 20 + height: 20 + radius: 10 + SFText { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + text: modelData.index + 1 + font.pixelSize: 10 + color: Style.content_inconspicuous + } + visible: modelData.value.length == 0 + } + Rectangle { id: correctPhraseRect - color: modelData.isCorrect ? Style.bright_teal : Style.validator_color - width: 20 - height: 20 - radius: 10 - SFText { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - text: modelData.index + 1 - font.pixelSize: 10 - color: Style.marine - } - visible: modelData.value.length > 0 - } - + color: modelData.isCorrect ? Style.content_accent_second : Style.validator_error + width: 20 + height: 20 + radius: 10 + SFText { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + text: modelData.index + 1 + font.pixelSize: 10 + color: Style.background + } + visible: modelData.value.length > 0 + } + DropShadow { anchors.fill: correctPhraseRect radius: 5 samples: 9 - color: modelData.isCorrect ? Style.bright_teal : Style.validator_color + color: modelData.isCorrect ? Style.content_accent_second : Style.validator_error source: correctPhraseRect visible: correctPhraseRect.visible - } + } } SFTextInput { @@ -764,13 +764,13 @@ Item anchors.bottomMargin: 6 width: 121 font.pixelSize: 14 - color: (modelData.isCorrect || modelData.value.length == 0) ? Style.white : Style.validator_color - backgroundColor: (modelData.isCorrect || modelData.value.length == 0) ? Style.white : Style.validator_color + color: (modelData.isCorrect || modelData.value.length == 0) ? Style.content_main : Style.validator_error + backgroundColor: (modelData.isCorrect || modelData.value.length == 0) ? Style.content_main : Style.validator_error text: modelData.value Component.onCompleted: { modelData.value = ""; if (defaultFocusItem == null) { - defaultFocusItem = phraseValue; + defaultFocusItem = phraseValue; } } } @@ -780,7 +780,7 @@ Item value: phraseValue.text } } - } + } } Item { @@ -809,7 +809,7 @@ Item var enable = true; for(var i = 0; i < viewModel.checkPhrases.length; ++i) { - enable &= viewModel.checkPhrases[i].isCorrect; + enable &= viewModel.checkPhrases[i].isCorrect; } return enable; } @@ -830,13 +830,13 @@ Item Component { id: restoreWallet Rectangle { - color: Style.marine + color: Style.background property Item defaultFocusItem: null ColumnLayout { anchors.horizontalCenter: parent.horizontalCenter anchors.fill: parent - anchors.topMargin: 50 + anchors.topMargin: 50 Column { spacing: 30 Layout.alignment: Qt.AlignHCenter | Qt.AlignTop @@ -845,7 +845,7 @@ Item anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Qt.AlignHCenter text: qsTr("Restore wallet") - color: Style.white + color: Style.content_main font.pixelSize: 36 } SFText { @@ -853,10 +853,10 @@ Item anchors.right: parent.right horizontalAlignment: Qt.AlignHCenter text: qsTr("Type in or paste your seed phrase") - color: Style.white + color: Style.content_main wrapMode: Text.WordWrap font.pixelSize: 14 - } + } } Grid{ @@ -866,83 +866,83 @@ Item columnSpacing: 30 rowSpacing: 20 - Repeater { - model:viewModel.recoveryPhrases - - Row { - width: 160 - height: 38 - spacing: 20 - Item { - anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: 9 - width: 20 - height: 20 - Rectangle { - color: "transparent" - border.color: Style.dark_slate_blue - width: 20 - height: 20 - radius: 10 - SFText { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - text: modelData.index + 1 - font.pixelSize: 10 - color: Style.dark_slate_blue - } - visible: modelData.value.length == 0 - } - - Rectangle { - id: correctPhraseRect - color: modelData.isAllowed ? Style.dark_slate_blue : Style.validator_color - width: 20 - height: 20 - radius: 10 - SFText { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - text: modelData.index + 1 - font.pixelSize: 10 - color: Style.white - opacity: 0.5 - } - visible: modelData.value.length > 0 - } - } - - SFTextInput { - id: phraseValue - anchors.bottom: parent.bottom - anchors.bottomMargin: 6 - width: 121 - font.pixelSize: 14 - color: (modelData.isAllowed || modelData.value.length == 0) ? Style.white : Style.validator_color - backgroundColor: (modelData.isAllowed || modelData.value.length == 0) ? Style.white : Style.validator_color - text: modelData.value - onTextEdited: { - var phrases = text.split(viewModel.phrasesSeparator); - if (phrases.length > viewModel.recoveryPhrases.length) { - for(var i = 0; i < viewModel.recoveryPhrases.length; ++i) - { - viewModel.recoveryPhrases[i].value = phrases[i]; - } - } - } - Component.onCompleted: { - if (modelData.index == 0) { - defaultFocusItem = phraseValue; - } - } - } - Binding { - target: modelData - property: "value" - value: phraseValue.text - } - } - } + Repeater { + model:viewModel.recoveryPhrases + + Row { + width: 160 + height: 38 + spacing: 20 + Item { + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: 9 + width: 20 + height: 20 + Rectangle { + color: "transparent" + border.color: Style.background_second + width: 20 + height: 20 + radius: 10 + SFText { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + text: modelData.index + 1 + font.pixelSize: 10 + color: Style.background_second + } + visible: modelData.value.length == 0 + } + + Rectangle { + id: correctPhraseRect + color: modelData.isAllowed ? Style.background_second : Style.validator_error + width: 20 + height: 20 + radius: 10 + SFText { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + text: modelData.index + 1 + font.pixelSize: 10 + color: Style.content_main + opacity: 0.5 + } + visible: modelData.value.length > 0 + } + } + + SFTextInput { + id: phraseValue + anchors.bottom: parent.bottom + anchors.bottomMargin: 6 + width: 121 + font.pixelSize: 14 + color: (modelData.isAllowed || modelData.value.length == 0) ? Style.content_main : Style.validator_error + backgroundColor: (modelData.isAllowed || modelData.value.length == 0) ? Style.content_main : Style.validator_error + text: modelData.value + onTextEdited: { + var phrases = text.split(viewModel.phrasesSeparator); + if (phrases.length > viewModel.recoveryPhrases.length) { + for(var i = 0; i < viewModel.recoveryPhrases.length; ++i) + { + viewModel.recoveryPhrases[i].value = phrases[i]; + } + } + } + Component.onCompleted: { + if (modelData.index == 0) { + defaultFocusItem = phraseValue; + } + } + } + Binding { + target: modelData + property: "value" + value: phraseValue.text + } + } + } } Item { @@ -960,7 +960,7 @@ Item icon.source: "qrc:/assets/icon-back.svg" onClicked: { startWizzardView.pop(); - viewModel.resetPhrases(); + viewModel.resetPhrases(); } } @@ -971,7 +971,7 @@ Item var enable = true; for(var i = 0; i < viewModel.recoveryPhrases.length; ++i) { - enable &= viewModel.recoveryPhrases[i].isAllowed; + enable &= viewModel.recoveryPhrases[i].isAllowed; } return enable; } @@ -993,14 +993,14 @@ Item id: create Rectangle { - color: Style.marine + color: Style.background property Item defaultFocusItem: password ColumnLayout { anchors.horizontalCenter: parent.horizontalCenter anchors.fill: parent - anchors.topMargin: 50 + anchors.topMargin: 50 Column { spacing: 30 Layout.alignment: Qt.AlignHCenter | Qt.AlignTop @@ -1009,7 +1009,7 @@ Item anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Qt.AlignHCenter text: qsTr("Create new wallet") - color: Style.white + color: Style.content_main font.pixelSize: 36 } SFText { @@ -1017,10 +1017,10 @@ Item anchors.right: parent.right horizontalAlignment: Qt.AlignHCenter text: qsTr("Create password to access your wallet") - color: Style.white + color: Style.content_main wrapMode: Text.WordWrap font.pixelSize: 14 - } + } } Column { @@ -1036,7 +1036,7 @@ Item SFText { text: qsTr("Enter password") - color: Style.white + color: Style.content_main font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold } @@ -1048,7 +1048,7 @@ Item width: parent.width font.pixelSize: 14 - color: Style.white + color: Style.content_main echoMode: TextInput.Password onTextChanged: if (password.text.length > 0) passwordError.text = "" } @@ -1058,12 +1058,12 @@ Item property var strengthTests: [ - {exp: new RegExp("(?=.{1,})") , color: Style.weak_pass_color, msg: "Very weak password"}, - {exp: new RegExp("((?=.{6,})(?=.*[0-9]))|((?=.{6,})(?=.*[A-Z]))|((?=.{6,})(?=.*[a-z]))") , color: Style.weak_pass_color, msg: "Weak password"}, - {exp: new RegExp("((?=.{6,})(?=.*[A-Z])(?=.*[a-z]))|((?=.{6,})(?=.*[0-9])(?=.*[a-z]))") , color: Style.medium_strength_pass_color, msg: "Medium strength password"}, - {exp: new RegExp("(?=.{8,})(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])") , color: Style.medium_strength_pass_color, msg: "Medium strength password"}, - {exp: new RegExp("(?=.{10,})(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])") , color: Style.strong_pass_color, msg: "Strong password"}, - {exp: new RegExp("(?=.{10,})(?=.*[!@#\$%\^&\*])(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])") , color: Style.strong_pass_color, msg: "Very strong password"}, + {exp: new RegExp("(?=.{1,})") , color: Style.validator_error, msg: "Very weak password"}, + {exp: new RegExp("((?=.{6,})(?=.*[0-9]))|((?=.{6,})(?=.*[A-Z]))|((?=.{6,})(?=.*[a-z]))") , color: Style.validator_error, msg: "Weak password"}, + {exp: new RegExp("((?=.{6,})(?=.*[A-Z])(?=.*[a-z]))|((?=.{6,})(?=.*[0-9])(?=.*[a-z]))") , color: Style.validator_warning, msg: "Medium strength password"}, + {exp: new RegExp("(?=.{8,})(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])") , color: Style.validator_warning, msg: "Medium strength password"}, + {exp: new RegExp("(?=.{10,})(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])") , color: Style.content_accent_second, msg: "Strong password"}, + {exp: new RegExp("(?=.{10,})(?=.*[!@#\$%\^&\*])(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])") , color: Style.content_accent_second, msg: "Very strong password"}, ] function passwordStrength(pass) @@ -1088,16 +1088,16 @@ Item Layout.fillWidth: true height: 4 border.width: index < parent.strength ? 0 : 1 - border.color: Style.dark_slate_blue + border.color: Style.background_second radius: 10 - color: index < parent.strength ? parent.strengthTests[parent.strength-1].color : Style.marine + color: index < parent.strength ? parent.strengthTests[parent.strength-1].color : Style.background } } } SFText { text: strengthChecker.strength > 0 ? strengthChecker.strengthTests[strengthChecker.strength-1].msg : "" - color: Style.strength_tests_msg_color + color: Style.content_inconspicuous font.pixelSize: 14 height: 16 width: parent.width @@ -1111,7 +1111,7 @@ Item SFText { text: qsTr("Confirm password") - color: Style.white + color: Style.content_main font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold } @@ -1121,14 +1121,14 @@ Item width: parent.width font.pixelSize: 14 - color: Style.white + color: Style.content_main echoMode: TextInput.Password onTextChanged: if (confirmPassword.text.length > 0) passwordError.text = "" } SFText { id: passwordError - color: Style.validator_color + color: Style.validator_error font.pixelSize: 14 height: 16 width: parent.width @@ -1166,7 +1166,7 @@ Item else { viewModel.setPassword(password.text); - startWizzardView.push(nodeSetup); + startWizzardView.push(nodeSetup); } } } @@ -1187,7 +1187,7 @@ Item Rectangle { id: nodeSetupRectangle - color: Style.marine + color: Style.background property Item defaultFocusItem: localNodeButton function onRestoreCancelled(useRandomNode) { @@ -1212,7 +1212,7 @@ Item ColumnLayout { anchors.horizontalCenter: parent.horizontalCenter anchors.fill: parent - anchors.topMargin: 50 + anchors.topMargin: 50 Column { spacing: 30 Layout.alignment: Qt.AlignHCenter | Qt.AlignTop @@ -1221,7 +1221,7 @@ Item anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Qt.AlignHCenter text: qsTr("Setup node connectivity") - color: Style.white + color: Style.content_main font.pixelSize: 36 } } @@ -1255,7 +1255,7 @@ Item SFText { text: qsTr("Enter port to listen") - color: Style.white + color: Style.content_main font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold } @@ -1265,13 +1265,13 @@ Item width: parent.width font.pixelSize: 14 - color: Style.white + color: Style.content_main text: viewModel.defaultPortToListen() onTextChanged: if (portInput.text.length > 0) portError.text = "" } SFText { id: portError - color: Style.validator_color + color: Style.validator_error font.pixelSize: 14 } @@ -1281,7 +1281,7 @@ Item SFText { text: qsTr("Peer") - color: Style.white + color: Style.content_main font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold } @@ -1291,7 +1291,7 @@ Item Layout.fillWidth: true activeFocusOnTab: true font.pixelSize: 12 - color: Style.white + color: Style.content_main text: viewModel.chooseRandomNode() validator: RegExpValidator { regExp: /^(\s|\x180E)*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])|([\w.-]+(?:\.[\w\.-]+)+))(:([0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?(\s|\x180E)*$/ } onTextChanged: if (peerError.text.length > 0) peerError.text = "" @@ -1299,7 +1299,7 @@ Item } SFText { id: peerError - color: Style.validator_color + color: Style.validator_error font.pixelSize: 14 } } @@ -1326,7 +1326,7 @@ Item visible: remoteNodeButton.checked width: parent.width - parent.spacing - remoteNodeButton.width font.pixelSize: 14 - color: Style.white + color: Style.content_main text: viewModel.defaultRemoteNodeAddr() validator: RegExpValidator { regExp: /^(\s|\x180E)*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])|([\w.-]+(?:\.[\w\.-]+)+))(:([0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?(\s|\x180E)*$/ } onTextChanged: if (remoteNodeAddrInput.text.length > 0) remoteNodeAddrError.text = "" @@ -1343,7 +1343,7 @@ Item SFText { id: remoteNodeAddrError - color: Style.validator_color + color: Style.validator_error font.pixelSize: 14 } } @@ -1371,16 +1371,16 @@ Item onClicked:{ if (localNodeButton.checked) { if (portInput.text.trim().length === 0) { - portError.text = qsTr("Please, specify port to listen "); - return; + portError.text = qsTr("Please, specify port to listen "); + return; } if (localNodePeer.text.trim().length === 0) { - peerError.text = qsTr("Please, specify correct peer"); - return; + peerError.text = qsTr("Please, specify correct peer"); + return; } if (!localNodePeer.acceptableInput) { peerError.text = qsTr("Please, specify peer"); - return; + return; } viewModel.setupLocalNode(parseInt(portInput.text), localNodePeer.text); @@ -1433,7 +1433,7 @@ Item root.parent.setSource("qrc:/loading.qml", {"isRecoveryMode" : false, "isCreating" : false}); } - color: Style.marine + color: Style.background Image { fillMode: Image.PreserveAspectCrop @@ -1445,10 +1445,10 @@ Item anchors.fill: parent spacing: 0 Item { - Layout.fillHeight: true - Layout.fillWidth: true - Layout.minimumHeight: 70 - Layout.maximumHeight: 280 + Layout.fillHeight: true + Layout.fillWidth: true + Layout.minimumHeight: 70 + Layout.maximumHeight: 280 } Loader { @@ -1459,19 +1459,19 @@ Item Layout.maximumHeight: 269 } Item { - Layout.fillHeight: true - Layout.minimumHeight: 30 - Layout.maximumHeight: 89 - + Layout.fillHeight: true + Layout.minimumHeight: 30 + Layout.maximumHeight: 89 + } Item { - Layout.preferredHeight: 186 + Layout.preferredHeight: 186 } Item { - Layout.fillHeight: true - Layout.fillWidth: true - Layout.minimumHeight: 67 + Layout.fillHeight: true + Layout.fillWidth: true + Layout.minimumHeight: 67 } } @@ -1479,28 +1479,28 @@ Item anchors.fill: parent spacing: 0 Item { - Layout.fillHeight: true - Layout.minimumHeight: 70 - Layout.maximumHeight: 280 + Layout.fillHeight: true + Layout.minimumHeight: 70 + Layout.maximumHeight: 280 } Item { - Layout.fillHeight: true - Layout.minimumHeight: 200 - Layout.maximumHeight: 269 + Layout.fillHeight: true + Layout.minimumHeight: 200 + Layout.maximumHeight: 269 } Item { - Layout.fillHeight: true - Layout.minimumHeight: 30 - Layout.maximumHeight: 89 + Layout.fillHeight: true + Layout.minimumHeight: 30 + Layout.maximumHeight: 89 } SFText { Layout.alignment: Qt.AlignHCenter text: qsTr("Enter your password to access the current wallet") - color: Style.white + color: Style.content_main font.pixelSize: 14 } @@ -1512,7 +1512,7 @@ Item SFText { text: qsTr("Enter password") - color: Style.white + color: Style.content_main font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold } @@ -1523,7 +1523,7 @@ Item focus: true activeFocusOnTab: true font.pixelSize: 14 - color: Style.white + color: Style.content_main echoMode: TextInput.Password onAccepted: btnCurrentWallet.clicked() onTextChanged: if (openPassword.text.length > 0) openPasswordError.text = "" @@ -1534,7 +1534,7 @@ Item height: 16 width: parent.width id: openPasswordError - color: Style.validator_color + color: Style.validator_error font.pixelSize: 14 } } @@ -1576,7 +1576,7 @@ Item visible: firstButtonVisible text: firstButtonText icon.source: firstButtonIcon - onClicked: firstButtonAction() + onClicked: firstButtonAction() } PrimaryButton { @@ -1605,8 +1605,8 @@ Item } Item { - Layout.fillHeight: true - Layout.minimumHeight: 67 + Layout.fillHeight: true + Layout.minimumHeight: 67 } } } diff --git a/ui/view/utxo.qml b/ui/view/utxo.qml index f8b115605..f7731e1be 100644 --- a/ui/view/utxo.qml +++ b/ui/view/utxo.qml @@ -22,7 +22,7 @@ ColumnLayout { Layout.minimumHeight: 40 Layout.maximumHeight: 40 font.pixelSize: 36 - color: Style.white + color: Style.content_main text: qsTr("UTXO") } @@ -46,7 +46,7 @@ ColumnLayout { Layout.maximumHeight: 20 font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Blockchain Height") } @@ -54,7 +54,7 @@ ColumnLayout { Layout.minimumHeight: 20 Layout.maximumHeight: 20 font.pixelSize: 16 - color: Style.bright_teal + color: Style.content_accent_second text: viewModel.currentHeight } } @@ -62,7 +62,7 @@ ColumnLayout { Rectangle { anchors.fill: parent radius: 10 - color: Style.white + color: Style.background_emphasize opacity: 0.1 } } @@ -85,7 +85,7 @@ ColumnLayout { Layout.maximumHeight: 20 font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Last block hash") } @@ -94,7 +94,7 @@ ColumnLayout { Layout.minimumHeight: 20 Layout.maximumHeight: 20 font.pixelSize: 16 - color: Style.bright_teal + color: Style.content_accent_second text: viewModel.currentStateHash elide: Text.ElideRight } @@ -103,15 +103,15 @@ ColumnLayout { Rectangle { anchors.fill: parent radius: 10 - color: Style.white + color: Style.background_emphasize opacity: 0.1 } } } StatusBar { - id: status_bar - model: statusbarModel + id: status_bar + model: statusbarModel } CustomTableView { @@ -166,7 +166,7 @@ ColumnLayout { height: tableView.rowHeight readonly property var lineSeparator: "\n" property var texts: styleData.value.split(lineSeparator) - property color secondLineColor: Style.second_line_color + property color secondLineColor: Style.content_inconspicuous ColumnLayout { anchors.right: parent.right @@ -200,27 +200,27 @@ ColumnLayout { function getTextColor(texts) { if (texts[0] === "available") { - return Style.bright_teal; + return Style.content_accent_second; } else if (texts[0] == "maturing") { - return Style.heliotrope; + return Style.content_accent_first; } else if (texts[0] === "spent") { - return Style.heliotrope; + return Style.content_accent_first; } else if (texts[0] === "unavailable") { - return Style.white; + return Style.content_main; } else if (texts[0] === "in progress") { if (texts[1] === "(change)" || texts[1] === "(outgoing)") { - return Style.heliotrope; + return Style.content_accent_first; } else { - return Style.bright_sky_blue; + return Style.content_accent_third; } } else { - return Style.white; + return Style.content_main; } } @@ -248,7 +248,7 @@ ColumnLayout { Rectangle { anchors.fill: parent - color: Style.light_navy + color: Style.background_third visible: styleData.alternate } } diff --git a/ui/view/wallet.qml b/ui/view/wallet.qml index 0c906d816..5e657768a 100644 --- a/ui/view/wallet.qml +++ b/ui/view/wallet.qml @@ -40,7 +40,7 @@ Item { background: Rectangle { radius: 10 - color: Style.dark_slate_blue + color: Style.background_second anchors.fill: parent } @@ -53,7 +53,7 @@ Item { SFText { anchors.horizontalCenter: parent.horizontalCenter text: qsTr("Can't send to the expired address.") - color: Style.white + color: Style.content_main font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold } @@ -69,7 +69,7 @@ Item { ConfirmationDialog { id: confirmationDialog - okButtonColor: Style.heliotrope + okButtonColor: Style.content_accent_first okButtonText: qsTr("send") okButtonIconSource: "qrc:/assets/icon-send-blue.svg" cancelButtonIconSource: "qrc:/assets/icon-cancel-white.svg" @@ -94,7 +94,7 @@ Item { font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Please review the transaction details") } @@ -113,7 +113,7 @@ Item { Layout.fillHeight: true Layout.minimumHeight: 16 font.pixelSize: 14 - color: Style.disable_text_color + color: Style.content_disabled text: qsTr("Recipient:") verticalAlignment: Text.AlignTop } @@ -126,7 +126,7 @@ Item { wrapMode: Text.Wrap maximumLineCount: 2 font.pixelSize: 14 - color: Style.white + color: Style.content_main } SFText { @@ -136,7 +136,7 @@ Item { Layout.minimumHeight: 16 Layout.bottomMargin: 3 font.pixelSize: 14 - color: Style.disable_text_color + color: Style.content_disabled text: qsTr("Amount:") verticalAlignment: Text.AlignBottom } @@ -147,7 +147,7 @@ Item { Layout.fillHeight: true Layout.minimumHeight: 29 font.pixelSize: 24 - color: Style.heliotrope + color: Style.content_accent_first verticalAlignment: Text.AlignBottom } @@ -156,7 +156,7 @@ Item { Layout.fillWidth: true Layout.minimumHeight: 16 font.pixelSize: 14 - color: Style.disable_text_color + color: Style.content_disabled text: qsTr("Transaction fee:") } @@ -165,7 +165,7 @@ Item { Layout.fillWidth: true Layout.minimumHeight: 16 font.pixelSize: 14 - color: Style.white + color: Style.content_main } } } @@ -210,7 +210,7 @@ Item { SFText { font.pixelSize: 36 - color: Style.white + color: Style.content_main text: qsTr("Wallet") } @@ -240,7 +240,7 @@ Item { Layout.minimumHeight: 21 font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Receive Beam") } @@ -258,7 +258,7 @@ Item { SFText { font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("My address") } @@ -266,7 +266,7 @@ Item { id: myAddressID width: parent.width font.pixelSize: 14 - color: Style.disable_text_color + color: Style.content_disabled readOnly: true activeFocusOnTab: false text: viewModel.newReceiverAddr @@ -277,7 +277,7 @@ Item { SFText { font.pixelSize: 14 font.italic: true - color: Style.white + color: Style.content_main text: qsTr("Expires:") } CustomComboBox { @@ -302,7 +302,7 @@ Item { SFText { font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Comment") } @@ -310,7 +310,7 @@ Item { id: myAddressName font.pixelSize: 14 width: parent.width - color: Style.white + color: Style.content_main focus: true text: viewModel.newReceiverName } @@ -339,7 +339,7 @@ Item { anchors.horizontalCenter: parent.horizontalCenter font.pixelSize: 14 font.italic: true - color: Style.white + color: Style.content_main text: qsTr("Scan to send") } } @@ -350,7 +350,7 @@ Item { Layout.alignment: Qt.AlignHCenter Layout.minimumHeight: 16 font.pixelSize: 14 - color: Style.white + color: Style.content_main text: qsTr("Send this address to the sender over an external secure channel") } Row { @@ -361,7 +361,7 @@ Item { CustomButton { text: qsTr("close") - palette.buttonText: Style.white + palette.buttonText: Style.content_main icon.source: "qrc:/assets/icon-cancel-white.svg" onClicked: { walletView.pop(); @@ -370,9 +370,9 @@ Item { CustomButton { text: qsTr("copy") - palette.buttonText: Style.marine - icon.color: Style.marine - palette.button: Style.bright_teal + palette.buttonText: Style.background + icon.color: Style.background + palette.button: Style.content_accent_second icon.source: "qrc:/assets/icon-copy.svg" onClicked: { viewModel.copyToClipboard(myAddressID.text); @@ -414,7 +414,7 @@ Item { Layout.alignment: Qt.AlignHCenter font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Send Beam") } @@ -443,7 +443,7 @@ Item { SFText { font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Send To:") } @@ -452,7 +452,7 @@ Item { id: receiverAddrInput font.pixelSize: 14 - color: Style.white + color: Style.content_main text: viewModel.receiverAddr validator: RegExpValidator { regExp: /[0-9a-fA-F]{1,80}/ } @@ -468,7 +468,7 @@ Item { SFText { Layout.alignment: Qt.AlignTop id: receiverAddressError - color: Style.validator_color + color: Style.validator_error font.pixelSize: 10 text: qsTr("Invalid address") visible: false @@ -476,7 +476,7 @@ Item { SFText { id: receiverName - color: Style.white + color: Style.content_main font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold } @@ -502,7 +502,7 @@ Item { SFText { font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Transaction amount") } @@ -516,7 +516,7 @@ Item { font.pixelSize: 36 font.styleName: "Light"; font.weight: Font.Light - color: Style.heliotrope + color: Style.content_accent_first property double amount: 0 @@ -545,7 +545,7 @@ Item { SFText { font.pixelSize: 24 - color: Style.white + color: Style.content_main text: qsTr("BEAM") } } @@ -556,7 +556,7 @@ Item { SFText { text: qsTr("Insufficient funds: you would need %1 to complete the transaction").arg(viewModel.amountMissingToSend) - color: Style.validator_color + color: Style.validator_error font.pixelSize: 14 fontSizeMode: Text.Fit minimumPixelSize: 10 @@ -587,7 +587,7 @@ Item { SFText { font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Comment") } @@ -596,7 +596,7 @@ Item { Layout.fillWidth: true font.pixelSize: 14 - color: Style.white + color: Style.content_main maximumLength: 1024 selectByMouse: true @@ -623,7 +623,7 @@ Item { SFText { font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.white + color: Style.content_main text: qsTr("Transaction fee") } @@ -639,7 +639,7 @@ Item { font.pixelSize: 36 font.styleName: "Light"; font.weight: Font.Light - color: Style.heliotrope + color: Style.content_accent_first text: viewModel.defaultFeeInGroth.toLocaleString(Qt.locale(), 'f', -128) @@ -666,7 +666,7 @@ Item { SFText { font.pixelSize: 24 - color: Style.white + color: Style.content_main text: qsTr("GROTH") } } @@ -707,7 +707,7 @@ Item { Layout.alignment: Qt.AlignHCenter font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.bluey_grey + color: Style.content_inconspicuous text: qsTr("Remaining") } @@ -720,7 +720,7 @@ Item { SFText { font.pixelSize: 24 font.styleName: "Light"; font.weight: Font.Light - color: Style.bluey_grey + color: Style.content_inconspicuous text: viewModel.actualAvailable } @@ -739,7 +739,7 @@ Item { Layout.topMargin: 10 Layout.bottomMargin: 10 width: 1 - color: Style.bluey_grey + color: Style.content_inconspicuous } Item { @@ -755,7 +755,7 @@ Item { Layout.alignment: Qt.AlignHCenter font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.bluey_grey + color: Style.content_inconspicuous text: qsTr("Change") } @@ -768,7 +768,7 @@ Item { SFText { font.pixelSize: 24 font.styleName: "Light"; font.weight: Font.Light - color: Style.bluey_grey + color: Style.content_inconspicuous text: viewModel.change } @@ -785,7 +785,7 @@ Item { Rectangle { anchors.fill: parent radius: 10 - color: Style.white + color: Style.background_emphasize opacity: 0.1 } } @@ -814,8 +814,8 @@ Item { CustomButton { text: qsTr("send") - palette.buttonText: Style.marine - palette.button: Style.heliotrope + palette.buttonText: Style.background + palette.button: Style.content_accent_first icon.source: "qrc:/assets/icon-send-blue.svg" enabled: {viewModel.isEnoughMoney && amount_input.amount > 0 && receiverAddrInput.acceptableInput } onClicked: { @@ -851,8 +851,8 @@ Item { spacing: 19 CustomButton { - palette.button: Style.bright_sky_blue - palette.buttonText: Style.marine + palette.button: Style.content_accent_third + palette.buttonText: Style.background icon.source: "qrc:/assets/icon-receive-blue.svg" text: qsTr("receive") @@ -863,8 +863,8 @@ Item { } CustomButton { - palette.button: Style.heliotrope - palette.buttonText: Style.marine + palette.button: Style.content_accent_first + palette.buttonText: Style.background icon.source: "qrc:/assets/icon-send-blue.svg" text: qsTr("send") @@ -931,7 +931,7 @@ Item { styleName: "Bold"; weight: Font.Bold } - color: Style.white + color: Style.content_main text: qsTr("Transactions") } @@ -1022,7 +1022,7 @@ Item { elide: Text.ElideRight anchors.verticalCenter: parent.verticalCenter text: styleData.value - color: Style.white + color: Style.content_main copyMenuEnabled: true onCopyText: viewModel.copyToClipboard(text) } @@ -1051,7 +1051,7 @@ Item { elide: Text.ElideMiddle anchors.verticalCenter: parent.verticalCenter text: styleData.value - color: Style.white + color: Style.content_main copyMenuEnabled: true onCopyText: viewModel.copyToClipboard(text) } @@ -1075,7 +1075,7 @@ Item { anchors.leftMargin: 20 anchors.right: parent.right anchors.left: parent.left - color: parent.income ? Style.bright_sky_blue : Style.heliotrope + color: parent.income ? Style.content_accent_third : Style.content_accent_first elide: Text.ElideRight anchors.verticalCenter: parent.verticalCenter font.pixelSize: 24 @@ -1138,17 +1138,17 @@ Item { function getTextColor () { if (!viewModel.transactions[styleData.row]) { - return Style.white; + return Style.content_main; } if (viewModel.transactions[styleData.row].inProgress() || viewModel.transactions[styleData.row].isCompleted()) { if (viewModel.transactions[styleData.row].isSelfTx()) { - return Style.white; + return Style.content_main; } - return viewModel.transactions[styleData.row].income ? Style.bright_sky_blue : Style.heliotrope; + return viewModel.transactions[styleData.row].income ? Style.content_accent_third : Style.content_accent_first; } - return Style.white; + return Style.content_main; } } } @@ -1246,7 +1246,7 @@ Item { Rectangle { height: transactionsView.rowHeight width: parent.width - color: styleData.alternate ? Style.table_row_color1 : Style.light_navy + color: styleData.alternate ? Style.background_second : Style.background_third } Item { id: txDetails @@ -1266,8 +1266,7 @@ Item { Rectangle { anchors.fill: parent - color: Style.bright_sky_blue - opacity: 0.1 + color: Style.background_fourth } TransactionDetails { id: detailsPanel diff --git a/ui/viewmodel/theme.cpp b/ui/viewmodel/theme.cpp new file mode 100644 index 000000000..01b3e04e9 --- /dev/null +++ b/ui/viewmodel/theme.cpp @@ -0,0 +1,40 @@ +// Copyright 2019 The Beam Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "theme.h" + +// static +QString Theme::name() +{ + // return "mainnet"; +#ifdef BEAM_TESTNET + return "testnet"; +#elif BEAM_MAINNET + return "mainnet"; +#else + return "masternet"; +#endif +} + +// static +QString Theme::iconPath() +{ +#ifdef BEAM_TESTNET + return ":/assets/icon_testnet.png"; +#elif BEAM_MAINNET + return ":/assets/icon.png"; +#else + return ":/assets/icon_masternet.png"; +#endif +} diff --git a/ui/viewmodel/theme.h b/ui/viewmodel/theme.h new file mode 100644 index 000000000..0787bc8f8 --- /dev/null +++ b/ui/viewmodel/theme.h @@ -0,0 +1,23 @@ +// Copyright 2019 The Beam Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once +#include + +class Theme : public QObject { + Q_OBJECT +public: + Q_INVOKABLE static QString name(); + static QString iconPath(); +}; From b5e40bc08e7caab3e61ad510ad5932f8b8a7eb83 Mon Sep 17 00:00:00 2001 From: szavarza Date: Thu, 28 Mar 2019 15:50:28 +0300 Subject: [PATCH 059/136] #522 icon for windows fixed --- ui/icons/icon_masternet.ico | Bin 67646 -> 24247 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ui/icons/icon_masternet.ico b/ui/icons/icon_masternet.ico index b0a08c26736dc4c4ec088f752093ef33fe4da90a..5d3a8d0fbf7afd8c0a5b8a248aef854a42ac5009 100644 GIT binary patch literal 24247 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 Y0osNdu%Aq{+yDRo07*qoM6N<$f&hFRP5=M^ literal 67646 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 Date: Mon, 1 Apr 2019 16:54:27 +0300 Subject: [PATCH 060/136] #463 color fixed --- ui/view/controls/CustomComboBox.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/view/controls/CustomComboBox.qml b/ui/view/controls/CustomComboBox.qml index 309c19c2f..ca2d6eacf 100644 --- a/ui/view/controls/CustomComboBox.qml +++ b/ui/view/controls/CustomComboBox.qml @@ -28,7 +28,7 @@ ComboBox { implicitWidth: 100 implicitHeight: 20 opacity: enabled ? 1 : 0.3 - color:itemDelegate.highlighted ? Style.content_accent_third : Style.content_inconspicuous + color:itemDelegate.highlighted ? Style.content_inconspicuous : Style.background_fourth } } @@ -81,14 +81,14 @@ ComboBox { background: Item { Rectangle { - color: Style.content_inconspicuous + color: Style.background_fourth anchors.left: parent.left anchors.right: parent.right height: control.height } Rectangle { anchors.fill: parent - color: Style.content_inconspicuous + color: Style.background_fourth radius: 10 } } From 7785343c5d7926810bacc5d6cc1c6552fa9813eb Mon Sep 17 00:00:00 2001 From: szavarza Date: Mon, 1 Apr 2019 17:09:02 +0300 Subject: [PATCH 061/136] #522 colors names --- ui/view/addresses.qml | 2 +- ui/view/color_themes/AbstractColors.qml | 42 +++++++++++--------- ui/view/color_themes/Mainnet.qml | 40 ++++++++++--------- ui/view/color_themes/Masternet.qml | 40 ++++++++++--------- ui/view/color_themes/Testnet.qml | 40 ++++++++++--------- ui/view/controls/AddressComboBox.qml | 10 ++--- ui/view/controls/AddressTable.qml | 2 +- ui/view/controls/AvailablePanel.qml | 4 +- ui/view/controls/ConfirmationDialog.qml | 4 +- ui/view/controls/ContextMenu.qml | 4 +- ui/view/controls/CustomButton.qml | 2 +- ui/view/controls/CustomCheckBox.qml | 4 +- ui/view/controls/CustomComboBox.qml | 6 +-- ui/view/controls/CustomProgressBar.qml | 4 +- ui/view/controls/CustomRadioButton.qml | 4 +- ui/view/controls/CustomSwitch.qml | 6 +-- ui/view/controls/CustomTableView.qml | 4 +- ui/view/controls/FeeSlider.qml | 12 +++--- ui/view/controls/Led.qml | 6 +-- ui/view/controls/LogoComponent.qml | 6 +-- ui/view/controls/PrimaryButton.qml | 4 +- ui/view/controls/SecondaryPanel.qml | 4 +- ui/view/controls/SecurityNote.qml | 2 +- ui/view/controls/StatusBar.qml | 10 ++--- ui/view/controls/TransactionDetails.qml | 12 +++--- ui/view/controls/TxFilter.qml | 4 +- ui/view/dashboard.qml | 2 +- ui/view/info.qml | 2 +- ui/view/loading.qml | 4 +- ui/view/main.qml | 8 ++-- ui/view/notification.qml | 2 +- ui/view/root.qml | 2 +- ui/view/settings.qml | 2 +- ui/view/start.qml | 46 +++++++++++----------- ui/view/utxo.qml | 22 +++++------ ui/view/wallet.qml | 52 ++++++++++++++----------- 36 files changed, 218 insertions(+), 202 deletions(-) diff --git a/ui/view/addresses.qml b/ui/view/addresses.qml index 3cb44631b..9c6469af4 100644 --- a/ui/view/addresses.qml +++ b/ui/view/addresses.qml @@ -202,7 +202,7 @@ ColumnLayout { Rectangle { anchors.fill: parent - color: styleData.selected ? Style.content_accent_third : Style.background_third + color: styleData.selected ? Style.row_selected : Style.background_row_even visible: styleData.selected ? true : styleData.alternate } } diff --git a/ui/view/color_themes/AbstractColors.qml b/ui/view/color_themes/AbstractColors.qml index 14a38b969..b1a4c95c8 100644 --- a/ui/view/color_themes/AbstractColors.qml +++ b/ui/view/color_themes/AbstractColors.qml @@ -1,23 +1,27 @@ import QtQuick 2.11 QtObject { - property color navigation_bar_background; - property color navigation_bar_active; - property color navigation_bar_passive; - property color navigation_bar_shadow; - property color background; - property color background_second; - property color background_third; - property color background_fourth; - property color background_emphasize; - property color background_emphasize_alternate; - property color background_inconspicuous; - property color content_main; - property color content_accent_first; - property color content_accent_second; - property color content_accent_third; - property color content_inconspicuous; - property color content_disabled; - property color validator_warning; - property color validator_error; + property color content_main; + property color accent_outgoing; + property color accent_incoming; + property color content_secondary; + property color content_disabled; + property color content_opposite; + property color validator_warning; + property color validator_error; + + property color navigation_background; + property color background_main; + property color background_second; + property color background_row_even; + property color background_details; + property color row_selected; + property color separator; + + property color active; + property color passive; + + property color gray_button; + + property color white: "#ffffff" } diff --git a/ui/view/color_themes/Mainnet.qml b/ui/view/color_themes/Mainnet.qml index 4fe78254f..a1b1b4ff9 100644 --- a/ui/view/color_themes/Mainnet.qml +++ b/ui/view/color_themes/Mainnet.qml @@ -2,23 +2,25 @@ import QtQuick 2.11 AbstractColors { // Color definitions - property color navigation_bar_background: "#02253c" - property color navigation_bar_active: "#00f6d2" - property color navigation_bar_passive: "#d6d9e0" - property color navigation_bar_shadow: "#00f6d2" - property color background: "#032e49" - property color background_second: "#1c435b" - property color background_third: "#0e3850" - property color background_fourth: "#09425e" - property color background_emphasize: "#ffffff" - property color background_emphasize_alternate: "#33566b" - property color background_inconspicuous: "#708090" - property color content_main: "#ffffff" - property color content_accent_first: "#da68f5" - property color content_accent_second: "#00f6d2" - property color content_accent_third: "#0bccf7" - property color content_inconspicuous: "#8da1ad" - property color content_disabled: "#889da9" - property color validator_warning: "#f4ce4a" - property color validator_error: "#ff625c" + property color content_main: "#ffffff" // white + property color accent_outgoing: "#da68f5" // heliotrope + property color accent_incoming: "#0bccf7" // bright-sky-blue + property color content_secondary: "#8da1ad" // bluey-grey + property color content_disabled: "#889da9" + property color content_opposite: "#032e49" // marine + property color validator_warning: "#f4ce4a" + property color validator_error: "#ff625c" + + property color navigation_background: "#02253c" // navy + property color background_main: "#032e49" // marine + property color background_second: "#1c435b" // dark-slate-blue + property color background_row_even: "#0e3850" // light-navy + property color background_details: "#09425e" + property color row_selected: "#085469" + property color separator: "#33566b" + + property color active : "#00f6d2" // bright-teal + property color passive: "#d6d9e0" // silver + + property color gray_button: "#708090" } diff --git a/ui/view/color_themes/Masternet.qml b/ui/view/color_themes/Masternet.qml index dd36b95ce..3272e54de 100644 --- a/ui/view/color_themes/Masternet.qml +++ b/ui/view/color_themes/Masternet.qml @@ -1,23 +1,25 @@ import QtQuick 2.11 AbstractColors { - property color navigation_bar_background: "#101010" - property color navigation_bar_active: "#00f6d2" - property color navigation_bar_passive: "#d6d9e0" - property color navigation_bar_shadow: "#00f6d2" - property color background: "#171717" - property color background_second: "#323232" - property color background_third: "#1D1D1D" - property color background_fourth: "#3D3D3D" - property color background_emphasize: "#ffffff" - property color background_emphasize_alternate: "#242424" - property color background_inconspicuous: "#708090" - property color content_main: "#ffffff" - property color content_accent_first: "#da68f5" - property color content_accent_second: "#00f6d2" - property color content_accent_third: "#0bccf7" - property color content_inconspicuous: "#8da1ad" - property color content_disabled: "#889da9" - property color validator_warning: "#f4ce4a" - property color validator_error: "#ff625c" + property color content_main: "#ffffff" // white + property color accent_outgoing: "#da68f5" // heliotrope + property color accent_incoming: "#0bccf7" // bright-sky-blue + property color content_secondary: "#8da1ad" // bluey-grey + property color content_disabled: "#889da9" + property color content_opposite: "#171717" + property color validator_warning: "#f4ce4a" + property color validator_error: "#ff625c" + + property color navigation_background: "#101010" + property color background_main: "#171717" + property color background_second: "#323232" + property color background_row_even: "#242424" + property color background_details: "#3d3d3d" + property color row_selected: "#353636" + property color separator: "#353636" + + property color active : "#00f6d2" // bright-teal + property color passive: "#d6d9e0" // silver + + property color gray_button: "#708090" } diff --git a/ui/view/color_themes/Testnet.qml b/ui/view/color_themes/Testnet.qml index e188aa5cb..79841a3f7 100644 --- a/ui/view/color_themes/Testnet.qml +++ b/ui/view/color_themes/Testnet.qml @@ -1,23 +1,25 @@ import QtQuick 2.11 AbstractColors { - property color navigation_bar_background: "#181223" - property color navigation_bar_active: "#00f6d2" - property color navigation_bar_passive: "#d6d9e0" - property color navigation_bar_shadow: "#00f6d2" - property color background: "#1e172c" - property color background_second: "#342e41" - property color background_third: "#292236" - property color background_fourth: "#3e384a" - property color background_emphasize: "#ffffff" - property color background_emphasize_alternate: "#1e172c" - property color background_inconspicuous: "#708090" - property color content_main: "#ffffff" - property color content_accent_first: "#da68f5" - property color content_accent_second: "#00f6d2" - property color content_accent_third: "#0bccf7" - property color content_inconspicuous: "#8da1ad" - property color content_disabled: "#889da9" - property color validator_warning: "#f4ce4a" - property color validator_error: "#ff625c" + property color content_main: "#ffffff" // white + property color accent_outgoing: "#da68f5" // heliotrope + property color accent_incoming: "#0bccf7" // bright-sky-blue + property color content_secondary: "#8da1ad" // bluey-grey + property color content_disabled: "#889da9" + property color content_opposite: "#171717" + property color validator_warning: "#f4ce4a" + property color validator_error: "#ff625c" + + property color navigation_background: "#181223" + property color background_main: "#1e172c" + property color background_second: "#342e41" + property color background_row_even: "#292236" + property color background_details: "#3e384a" + property color row_selected: "#534e5e" + property color separator: "#342e41" + + property color active : "#00f6d2" // bright-teal + property color passive: "#d6d9e0" // silver + + property color gray_button: "#708090" } diff --git a/ui/view/controls/AddressComboBox.qml b/ui/view/controls/AddressComboBox.qml index 934b03e8a..7081c0d90 100644 --- a/ui/view/controls/AddressComboBox.qml +++ b/ui/view/controls/AddressComboBox.qml @@ -29,7 +29,7 @@ ComboBox { implicitWidth: 100 implicitHeight: 40 opacity: enabled ? 1 : 0.3 - color:itemDelegate.highlighted ? Style.content_inconspicuous : Style.content_accent_third + color:itemDelegate.highlighted ? Style.content_secondary : Style.accent_incoming } } @@ -55,7 +55,7 @@ ComboBox { width: control.width height: 1 y: control.height - 1 - color: Style.background_emphasize_alternate + color: Style.separator } } @@ -78,7 +78,7 @@ ComboBox { Rectangle { Layout.fillWidth: true height: 1 - color: Style.background_emphasize_alternate + color: Style.separator }*/ ListView { id: listView @@ -97,14 +97,14 @@ ComboBox { background: Item { Rectangle { - color: Style.content_accent_third + color: Style.accent_incoming anchors.left: parent.left anchors.right: parent.right height: control.height } Rectangle { anchors.fill: parent - color: Style.content_accent_third + color: Style.accent_incoming radius: 10 } } diff --git a/ui/view/controls/AddressTable.qml b/ui/view/controls/AddressTable.qml index d3fde6460..449bda7ef 100644 --- a/ui/view/controls/AddressTable.qml +++ b/ui/view/controls/AddressTable.qml @@ -95,7 +95,7 @@ CustomTableView { Rectangle { anchors.fill: parent - color: styleData.selected ? Style.content_accent_third : Style.background_third + color: styleData.selected ? Style.row_selected : Style.background_row_even visible: styleData.selected ? true : styleData.alternate } } diff --git a/ui/view/controls/AvailablePanel.qml b/ui/view/controls/AvailablePanel.qml index 759c1fd57..272299725 100644 --- a/ui/view/controls/AvailablePanel.qml +++ b/ui/view/controls/AvailablePanel.qml @@ -44,7 +44,7 @@ Rectangle { id: amount_text font.pixelSize: 36 font.styleName: "Light"; font.weight: Font.Light - color: Style.content_accent_second + color: Style.active text: value anchors.bottom: parent.bottom @@ -56,7 +56,7 @@ Rectangle { id: currency_text font.pixelSize: 24 font.styleName: "Light"; font.weight: Font.Light - color: Style.content_accent_second + color: Style.active text: "BEAM" anchors.bottom: parent.bottom diff --git a/ui/view/controls/ConfirmationDialog.qml b/ui/view/controls/ConfirmationDialog.qml index 498b1048c..b4d9cda50 100644 --- a/ui/view/controls/ConfirmationDialog.qml +++ b/ui/view/controls/ConfirmationDialog.qml @@ -64,9 +64,9 @@ Dialog { CustomButton { id: okButton - palette.button: Style.content_accent_second + palette.button: Style.active text: qsTr("delete") - palette.buttonText: Style.background + palette.buttonText: Style.content_opposite onClicked: { accepted(); close(); diff --git a/ui/view/controls/ContextMenu.qml b/ui/view/controls/ContextMenu.qml index 831660138..2bdfd67e6 100644 --- a/ui/view/controls/ContextMenu.qml +++ b/ui/view/controls/ContextMenu.qml @@ -46,7 +46,7 @@ Menu { implicitWidth: 200 implicitHeight: 40 opacity: enabled ? 1 : 0.3 - color: control.hovered ? Style.content_accent_third : "transparent" + color: control.hovered ? Style.accent_incoming : "transparent" } } @@ -54,7 +54,7 @@ Menu { implicitWidth: 200 implicitHeight: 40 border.width: 1 - border.color: Style.background_emphasize_alternate + border.color: Style.separator color: Style.background_second //opacity: 0.1 radius: 10 diff --git a/ui/view/controls/CustomButton.qml b/ui/view/controls/CustomButton.qml index 9df267f82..f3fdc19fe 100644 --- a/ui/view/controls/CustomButton.qml +++ b/ui/view/controls/CustomButton.qml @@ -9,7 +9,7 @@ import "." Button { id: control - palette.button: Style.background_emphasize_alternate + palette.button: Style.separator palette.buttonText: Style.content_main property alias textOpacity: rect.opacity property alias shadowSamples: drop_shadow.samples diff --git a/ui/view/controls/CustomCheckBox.qml b/ui/view/controls/CustomCheckBox.qml index 1660c8e13..10597b837 100644 --- a/ui/view/controls/CustomCheckBox.qml +++ b/ui/view/controls/CustomCheckBox.qml @@ -6,7 +6,7 @@ import QtQuick.Controls.impl 2.4 T.CheckBox { id: control palette.windowText: Style.content_main - palette.text: Style.content_accent_second + palette.text: Style.active implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, @@ -27,7 +27,7 @@ T.CheckBox { color: "transparent" border.width: control.visualFocus ? 2 : 1 - border.color: control.visualFocus ? control.palette.highlight : Style.content_inconspicuous + border.color: control.visualFocus ? control.palette.highlight : Style.content_secondary ColorImage { x: (parent.width - width) / 2 diff --git a/ui/view/controls/CustomComboBox.qml b/ui/view/controls/CustomComboBox.qml index ca2d6eacf..506780732 100644 --- a/ui/view/controls/CustomComboBox.qml +++ b/ui/view/controls/CustomComboBox.qml @@ -28,7 +28,7 @@ ComboBox { implicitWidth: 100 implicitHeight: 20 opacity: enabled ? 1 : 0.3 - color:itemDelegate.highlighted ? Style.content_inconspicuous : Style.background_fourth + color:itemDelegate.highlighted ? Style.content_secondary : Style.background_details } } @@ -81,14 +81,14 @@ ComboBox { background: Item { Rectangle { - color: Style.background_fourth + color: Style.background_details anchors.left: parent.left anchors.right: parent.right height: control.height } Rectangle { anchors.fill: parent - color: Style.background_fourth + color: Style.background_details radius: 10 } } diff --git a/ui/view/controls/CustomProgressBar.qml b/ui/view/controls/CustomProgressBar.qml index 83a0dfca5..8816befe9 100644 --- a/ui/view/controls/CustomProgressBar.qml +++ b/ui/view/controls/CustomProgressBar.qml @@ -27,7 +27,7 @@ T.ProgressBar { scale: control.mirrored ? -1 : 1 width: control.visualPosition * parent.width height: parent.height - color: Style.content_accent_second + color: Style.active } } @@ -46,7 +46,7 @@ T.ProgressBar { anchors.fill: contentItem radius: 5 samples: 9 - color: Style.content_accent_second + color: Style.active source: contentItem } } diff --git a/ui/view/controls/CustomRadioButton.qml b/ui/view/controls/CustomRadioButton.qml index e48cb9e5a..288a932f2 100644 --- a/ui/view/controls/CustomRadioButton.qml +++ b/ui/view/controls/CustomRadioButton.qml @@ -9,7 +9,7 @@ import "." T.RadioButton { id: control palette.windowText: Style.content_main - palette.text: Style.content_accent_second + palette.text: Style.active implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem.implicitWidth + leftPadding + rightPadding) @@ -36,7 +36,7 @@ T.RadioButton { radius: width / 2 color: "transparent"//control.down ? control.palette.light : control.palette.base border.width: 1 //control.visualFocus ? 2 : 1 - border.color: Style.content_inconspicuous //control.visualFocus ? control.palette.highlight : control.palette.mid + border.color: Style.content_secondary //control.visualFocus ? control.palette.highlight : control.palette.mid Rectangle { x: (parent.width - width) / 2 diff --git a/ui/view/controls/CustomSwitch.qml b/ui/view/controls/CustomSwitch.qml index 0fe7474ff..d88964feb 100644 --- a/ui/view/controls/CustomSwitch.qml +++ b/ui/view/controls/CustomSwitch.qml @@ -23,7 +23,7 @@ T.Switch { rightPadding: control.indicator.width + control.spacing text: control.text font: control.font - color: control.checked && control.enabled ? control.palette.text : Style.content_inconspicuous + color: control.checked && control.enabled ? control.palette.text : Style.content_secondary elide: Text.ElideRight verticalAlignment: Text.AlignVCenter } @@ -35,7 +35,7 @@ T.Switch { y: parent.height / 2 - height / 2 radius: 10 color: "transparent" - border.color: Style.content_inconspicuous + border.color: Style.content_secondary Rectangle { x: control.checked ? parent.width - width - 2 : 2 @@ -43,7 +43,7 @@ T.Switch { width: 16 height: 16 radius: 10 - color: control.checked && control.enabled ? Style.content_accent_second : Style.content_inconspicuous + color: control.checked && control.enabled ? Style.active : Style.content_secondary } } } \ No newline at end of file diff --git a/ui/view/controls/CustomTableView.qml b/ui/view/controls/CustomTableView.qml index 7e694a8b4..9528ea47d 100644 --- a/ui/view/controls/CustomTableView.qml +++ b/ui/view/controls/CustomTableView.qml @@ -19,7 +19,7 @@ TableView { implicitHeight: 16 radius: 6 anchors.fill: parent - color: Style.background_emphasize + color: Style.white // opacity: 0.1 } } @@ -35,7 +35,7 @@ TableView { anchors.left: parent.left anchors.leftMargin: headerTextLeftMargin font.pixelSize: headerTextFontSize - color: tableView.sortIndicatorColumn == styleData.column ? Style.content_main : Style.content_inconspicuous + color: tableView.sortIndicatorColumn == styleData.column ? Style.content_main : Style.content_secondary font.weight: tableView.sortIndicatorColumn == styleData.column ? Font.Bold : Font.Normal font.family: "SF Pro Display" font.styleName: "Regular" diff --git a/ui/view/controls/FeeSlider.qml b/ui/view/controls/FeeSlider.qml index f973d4854..7f5eaffa9 100644 --- a/ui/view/controls/FeeSlider.qml +++ b/ui/view/controls/FeeSlider.qml @@ -24,7 +24,7 @@ T.Slider { implicitWidth: 20 implicitHeight: 20 radius: width / 2 - color: control.enabled ? Style.content_accent_second : Style.content_disabled + color: control.enabled ? Style.active : Style.content_disabled SFText { @@ -37,7 +37,7 @@ T.Slider { y: -26 font.pixelSize: 14 text: control.value.toFixed(control.precision) - color: control.enabled ? Style.content_accent_second : Style.content_disabled + color: control.enabled ? Style.active : Style.content_disabled } } @@ -61,7 +61,7 @@ T.Slider { Rectangle { anchors.fill: parent - color: Style.background_emphasize + color: Style.white opacity: 0.1 radius: 2 } @@ -73,7 +73,7 @@ T.Slider { x: (handle.width / 2) + ((control.availableWidth - handle.width) / control.to) * index width: 1 height: 4 - color: Style.content_inconspicuous + color: Style.content_secondary visible: control.showTicks } model: control.to + 1 @@ -87,14 +87,14 @@ T.Slider { SFText { font.pixelSize: 14 - color: Style.content_inconspicuous + color: Style.content_secondary text: control.from.toFixed(control.precision) } SFText { anchors.right: parent.right font.pixelSize: 14 - color: Style.content_inconspicuous + color: Style.content_secondary text: control.to.toFixed(control.precision) } } diff --git a/ui/view/controls/Led.qml b/ui/view/controls/Led.qml index 0a9249fa3..c8ac4870f 100644 --- a/ui/view/controls/Led.qml +++ b/ui/view/controls/Led.qml @@ -17,7 +17,7 @@ Item { anchors.fill: parent radius: 3 - color: Style.content_inconspicuous + color: Style.content_secondary } Rectangle { @@ -25,7 +25,7 @@ Item { anchors.fill: parent radius: 3 - color: Style.content_accent_second + color: Style.active visible: root.turned_on } @@ -33,7 +33,7 @@ Item { anchors.fill: led_light radius: 5 samples: 9 - color: Style.content_accent_second + color: Style.active source: led_light visible: root.turned_on } diff --git a/ui/view/controls/LogoComponent.qml b/ui/view/controls/LogoComponent.qml index 2ff5e222c..631aeffea 100644 --- a/ui/view/controls/LogoComponent.qml +++ b/ui/view/controls/LogoComponent.qml @@ -29,7 +29,7 @@ Component Layout.alignment: Qt.AlignHCenter text: qsTr("BEAM") - color: Style.content_accent_third + color: Style.accent_incoming font.pixelSize: 32 font.styleName: "Bold"; font.weight: Font.Bold font.letterSpacing: 20 @@ -49,7 +49,7 @@ Component text: qsTr("Scalable confidential cryptocurrency") - color: Style.content_accent_third + color: Style.accent_incoming font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold } @@ -67,7 +67,7 @@ Component id: stagingLabel visible: false Layout.alignment: Qt.AlignHCenter - color: Style.content_inconspicuous + color: Style.content_secondary font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold } diff --git a/ui/view/controls/PrimaryButton.qml b/ui/view/controls/PrimaryButton.qml index caa8e9f3c..867cd1ea5 100644 --- a/ui/view/controls/PrimaryButton.qml +++ b/ui/view/controls/PrimaryButton.qml @@ -4,8 +4,8 @@ import QtQuick.Controls.Styles 1.2 import "." CustomButton { - palette.button: Style.content_accent_second - palette.buttonText: Style.background + palette.button: Style.active + palette.buttonText: Style.content_opposite SFText { id: text diff --git a/ui/view/controls/SecondaryPanel.qml b/ui/view/controls/SecondaryPanel.qml index 23d80c563..0f9b74bb6 100644 --- a/ui/view/controls/SecondaryPanel.qml +++ b/ui/view/controls/SecondaryPanel.qml @@ -65,7 +65,7 @@ Rectangle { font.pixelSize: 20 fontSizeMode: Text.Fit minimumPixelSize: 14 - color: Style.content_accent_third + color: Style.accent_incoming text: (receiving !== "0") ? "+" + receiving : receiving; elide: Text.ElideRight copyMenuEnabled: true @@ -105,7 +105,7 @@ Rectangle { font.pixelSize: 20 fontSizeMode: Text.Fit minimumPixelSize: 14 - color: Style.content_accent_first + color: Style.accent_outgoing text: (sending !== "0") ? "-" + sending : sending; elide: Text.ElideRight copyMenuEnabled: true diff --git a/ui/view/controls/SecurityNote.qml b/ui/view/controls/SecurityNote.qml index bef679966..065edc1bc 100644 --- a/ui/view/controls/SecurityNote.qml +++ b/ui/view/controls/SecurityNote.qml @@ -22,7 +22,7 @@ ColumnLayout { anchors.fill: icon radius: 7 samples: 9 - color: Style.content_accent_second + color: Style.active source: icon } } diff --git a/ui/view/controls/StatusBar.qml b/ui/view/controls/StatusBar.qml index 0d336c0b2..e498b272f 100644 --- a/ui/view/controls/StatusBar.qml +++ b/ui/view/controls/StatusBar.qml @@ -42,7 +42,7 @@ Item { anchors.left: parent.left width: childrenRect.width - property color color: Style.content_accent_second + property color color: Style.active property int radius: rootControl.indicator_radius Rectangle { @@ -73,7 +73,7 @@ Item { anchors.left: parent.left visible: false - property color color: Style.content_accent_second + property color color: Style.active property int circle_line_width: 2 property int animation_duration: 2000 @@ -108,7 +108,7 @@ Item { anchors.left: parent.indicator.right anchors.leftMargin: 5 anchors.topMargin: -3 - color: Style.content_inconspicuous + color: Style.content_secondary font.pixelSize: 14 } SFText { @@ -117,7 +117,7 @@ Item { anchors.left: status_text.right anchors.leftMargin: 5 anchors.topMargin: -3 - color: Style.content_inconspicuous + color: Style.content_secondary font.pixelSize: 14 text: "(" + model.nodeSyncProgress + "%)" visible: model.nodeSyncProgress > 0 && update_indicator.visible @@ -154,7 +154,7 @@ Item { StateChangeScript { name: "onlineScript" script: { - online_indicator.color = Style.content_accent_second; + online_indicator.color = Style.active; rootControl.setIndicator(online_indicator); } } diff --git a/ui/view/controls/TransactionDetails.qml b/ui/view/controls/TransactionDetails.qml index 4313c0753..6387bcd14 100644 --- a/ui/view/controls/TransactionDetails.qml +++ b/ui/view/controls/TransactionDetails.qml @@ -33,7 +33,7 @@ RowLayout { SFText { Layout.alignment: Qt.AlignTop font.pixelSize: 14 - color: Style.content_inconspicuous + color: Style.content_secondary text: qsTr("Sending address:") } SFLabel { @@ -52,7 +52,7 @@ RowLayout { SFText { Layout.alignment: Qt.AlignTop font.pixelSize: 14 - color: Style.content_inconspicuous + color: Style.content_secondary text: qsTr("Receiving address:") } SFLabel { @@ -71,7 +71,7 @@ RowLayout { SFText { Layout.alignment: Qt.AlignTop font.pixelSize: 14 - color: Style.content_inconspicuous + color: Style.content_secondary text: qsTr("Transaction fee:") } SFLabel { @@ -88,7 +88,7 @@ RowLayout { SFText { Layout.alignment: Qt.AlignTop font.pixelSize: 14 - color: Style.content_inconspicuous + color: Style.content_secondary text: qsTr("Comment:") } SFLabel { @@ -108,7 +108,7 @@ RowLayout { SFText { Layout.alignment: Qt.AlignTop font.pixelSize: 14 - color: Style.content_inconspicuous + color: Style.content_secondary text: qsTr("Kernel ID:") } SFLabel { @@ -126,7 +126,7 @@ RowLayout { SFText { Layout.alignment: Qt.AlignTop font.pixelSize: 14 - color: Style.content_inconspicuous + color: Style.content_secondary text: qsTr("Error: ") visible: model ? model.failureReason.length > 0 : false } diff --git a/ui/view/controls/TxFilter.qml b/ui/view/controls/TxFilter.qml index 6d8ed3ec9..aa862f007 100644 --- a/ui/view/controls/TxFilter.qml +++ b/ui/view/controls/TxFilter.qml @@ -43,7 +43,7 @@ Item { width: text_label.width + 16 height: 2 - color: Style.content_accent_second + color: Style.active visible: false } @@ -52,7 +52,7 @@ Item { anchors.fill: led radius: 5 samples: 9 - color: Style.content_accent_second + color: Style.active source: led visible: led.visible diff --git a/ui/view/dashboard.qml b/ui/view/dashboard.qml index 160b34baa..c0dceaed2 100644 --- a/ui/view/dashboard.qml +++ b/ui/view/dashboard.qml @@ -5,7 +5,7 @@ import QtQuick.Controls.Styles 1.2 Rectangle { anchors.fill: parent - color: Style.background + color: Style.background_main Text { anchors.centerIn: parent diff --git a/ui/view/info.qml b/ui/view/info.qml index 84a1d3f06..f885c1680 100644 --- a/ui/view/info.qml +++ b/ui/view/info.qml @@ -5,7 +5,7 @@ import QtQuick.Controls.Styles 1.2 Rectangle { anchors.fill: parent - color: Style.background + color: Style.background_main Text { anchors.centerIn: parent diff --git a/ui/view/loading.qml b/ui/view/loading.qml index 82d86ee40..17c2f0ab7 100644 --- a/ui/view/loading.qml +++ b/ui/view/loading.qml @@ -17,7 +17,7 @@ Item ConfirmationDialog { id: confirmationDialog - okButtonColor: Style.content_accent_second + okButtonColor: Style.active okButtonText: qsTr("change settings") okButtonIconSource: "qrc:/assets/icon-settings-blue.svg" cancelButtonIconSource: "qrc:/assets/icon-cancel-white.svg" @@ -91,7 +91,7 @@ Item Rectangle { anchors.fill: parent - color: Style.background + color: Style.background_main Image { fillMode: Image.PreserveAspectCrop diff --git a/ui/view/main.qml b/ui/view/main.qml index 09fed8cda..edc94aaeb 100644 --- a/ui/view/main.qml +++ b/ui/view/main.qml @@ -17,7 +17,7 @@ Rectangle { id: statusbarModel } - color: Style.background + color: Style.background_main MouseArea { id: mainMouseArea @@ -47,7 +47,7 @@ Rectangle { id: sidebar width: 70 height: 0 - color: Style.navigation_bar_background + color: Style.navigation_background border.width: 0 anchors.bottom: parent.bottom anchors.left: parent.left @@ -87,14 +87,14 @@ Rectangle { y: 6 width: 4 height: 48 - color: selectedItem == index ? Style.navigation_bar_active : Style.navigation_bar_passive + color: selectedItem == index ? Style.active : Style.passive } DropShadow { anchors.fill: indicator radius: 5 samples: 9 - color: Style.navigation_bar_shadow + color: Style.active source: indicator } diff --git a/ui/view/notification.qml b/ui/view/notification.qml index 42bd20969..fb79cab51 100644 --- a/ui/view/notification.qml +++ b/ui/view/notification.qml @@ -5,7 +5,7 @@ import QtQuick.Controls.Styles 1.2 Rectangle { anchors.fill: parent - color: Style.background + color: Style.background_main Text { anchors.centerIn: parent diff --git a/ui/view/root.qml b/ui/view/root.qml index f99858b2b..b7257f0e1 100644 --- a/ui/view/root.qml +++ b/ui/view/root.qml @@ -15,7 +15,7 @@ Window { Popup { id: notifications closePolicy: Popup.NoAutoClose - palette.window : Style.background + palette.window : Style.background_main MessagesViewModel {id: viewModel} parent: Overlay.overlay diff --git a/ui/view/settings.qml b/ui/view/settings.qml index 5863dbcab..b014a12a3 100644 --- a/ui/view/settings.qml +++ b/ui/view/settings.qml @@ -9,7 +9,7 @@ import Beam.Wallet 1.0 Rectangle { anchors.fill: parent - color: Style.background + color: Style.background_main SettingsViewModel {id: viewModel} diff --git a/ui/view/start.qml b/ui/view/start.qml index 66308a3ab..0bd10c2d2 100644 --- a/ui/view/start.qml +++ b/ui/view/start.qml @@ -34,7 +34,7 @@ Item id: start Rectangle { - color: Style.background + color: Style.background_main Image { fillMode: Image.PreserveAspectCrop @@ -148,7 +148,7 @@ Item id: migrate Rectangle { - color: Style.background + color: Style.background_main Image { fillMode: Image.PreserveAspectCrop @@ -216,7 +216,7 @@ Item SFText { Layout.alignment: Qt.AlignHCenter text: qsTr("Login to another wallet or create new one") - color: Style.content_accent_second + color: Style.active font.pixelSize: 14 MouseArea { @@ -242,7 +242,7 @@ Item id: selectWalletDBView Rectangle { - color: Style.background + color: Style.background_main ColumnLayout { anchors.fill: parent anchors.topMargin: 50 @@ -285,7 +285,7 @@ Item anchors.leftMargin: tableView.textLeftMargin horizontalAlignment: Qt.AlignHCenter font.pixelSize: tableView.headerTextFontSize - color: Style.content_inconspicuous + color: Style.content_secondary font.weight: Font.Normal text: styleData.value } @@ -352,7 +352,7 @@ Item Rectangle { anchors.fill: parent - color: styleData.selected ? "#085469" : Style.background_third + color: styleData.selected ? Style.row_selected : Style.background_row_even visible: styleData.alternate || styleData.selected } } @@ -430,7 +430,7 @@ Item SFText { Layout.alignment: Qt.AlignHCenter text: qsTr("Login to another wallet or create new one") - color: Style.content_accent_second + color: Style.active font.pixelSize: 14 MouseArea { @@ -457,7 +457,7 @@ Item id: createWalletEntry Rectangle { - color: Style.background + color: Style.background_main property Item defaultFocusItem: generateRecoveryPhraseButton ColumnLayout { @@ -540,7 +540,7 @@ Item Component { id: generateRecoveryPhrase Rectangle { - color: Style.background + color: Style.background_main property Item defaultFocusItem: nextButton ColumnLayout { @@ -668,7 +668,7 @@ Item Component { id: checkRecoveryPhrase Rectangle { - color: Style.background + color: Style.background_main property Item defaultFocusItem: null ColumnLayout { @@ -718,7 +718,7 @@ Item height: 20 Rectangle { color: "transparent" - border.color: Style.content_inconspicuous + border.color: Style.content_secondary width: 20 height: 20 radius: 10 @@ -727,14 +727,14 @@ Item anchors.horizontalCenter: parent.horizontalCenter text: modelData.index + 1 font.pixelSize: 10 - color: Style.content_inconspicuous + color: Style.content_secondary } visible: modelData.value.length == 0 } Rectangle { id: correctPhraseRect - color: modelData.isCorrect ? Style.content_accent_second : Style.validator_error + color: modelData.isCorrect ? Style.active : Style.validator_error width: 20 height: 20 radius: 10 @@ -743,7 +743,7 @@ Item anchors.horizontalCenter: parent.horizontalCenter text: modelData.index + 1 font.pixelSize: 10 - color: Style.background + color: Style.background_main } visible: modelData.value.length > 0 } @@ -752,7 +752,7 @@ Item anchors.fill: correctPhraseRect radius: 5 samples: 9 - color: modelData.isCorrect ? Style.content_accent_second : Style.validator_error + color: modelData.isCorrect ? Style.active : Style.validator_error source: correctPhraseRect visible: correctPhraseRect.visible } @@ -830,7 +830,7 @@ Item Component { id: restoreWallet Rectangle { - color: Style.background + color: Style.background_main property Item defaultFocusItem: null ColumnLayout { @@ -993,7 +993,7 @@ Item id: create Rectangle { - color: Style.background + color: Style.background_main property Item defaultFocusItem: password @@ -1062,8 +1062,8 @@ Item {exp: new RegExp("((?=.{6,})(?=.*[0-9]))|((?=.{6,})(?=.*[A-Z]))|((?=.{6,})(?=.*[a-z]))") , color: Style.validator_error, msg: "Weak password"}, {exp: new RegExp("((?=.{6,})(?=.*[A-Z])(?=.*[a-z]))|((?=.{6,})(?=.*[0-9])(?=.*[a-z]))") , color: Style.validator_warning, msg: "Medium strength password"}, {exp: new RegExp("(?=.{8,})(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])") , color: Style.validator_warning, msg: "Medium strength password"}, - {exp: new RegExp("(?=.{10,})(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])") , color: Style.content_accent_second, msg: "Strong password"}, - {exp: new RegExp("(?=.{10,})(?=.*[!@#\$%\^&\*])(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])") , color: Style.content_accent_second, msg: "Very strong password"}, + {exp: new RegExp("(?=.{10,})(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])") , color: Style.active, msg: "Strong password"}, + {exp: new RegExp("(?=.{10,})(?=.*[!@#\$%\^&\*])(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])") , color: Style.active, msg: "Very strong password"}, ] function passwordStrength(pass) @@ -1090,14 +1090,14 @@ Item border.width: index < parent.strength ? 0 : 1 border.color: Style.background_second radius: 10 - color: index < parent.strength ? parent.strengthTests[parent.strength-1].color : Style.background + color: index < parent.strength ? parent.strengthTests[parent.strength-1].color : Style.background_main } } } SFText { text: strengthChecker.strength > 0 ? strengthChecker.strengthTests[strengthChecker.strength-1].msg : "" - color: Style.content_inconspicuous + color: Style.content_secondary font.pixelSize: 14 height: 16 width: parent.width @@ -1187,7 +1187,7 @@ Item Rectangle { id: nodeSetupRectangle - color: Style.background + color: Style.background_main property Item defaultFocusItem: localNodeButton function onRestoreCancelled(useRandomNode) { @@ -1433,7 +1433,7 @@ Item root.parent.setSource("qrc:/loading.qml", {"isRecoveryMode" : false, "isCreating" : false}); } - color: Style.background + color: Style.background_main Image { fillMode: Image.PreserveAspectCrop diff --git a/ui/view/utxo.qml b/ui/view/utxo.qml index f7731e1be..1624f7dbb 100644 --- a/ui/view/utxo.qml +++ b/ui/view/utxo.qml @@ -54,7 +54,7 @@ ColumnLayout { Layout.minimumHeight: 20 Layout.maximumHeight: 20 font.pixelSize: 16 - color: Style.content_accent_second + color: Style.active text: viewModel.currentHeight } } @@ -62,7 +62,7 @@ ColumnLayout { Rectangle { anchors.fill: parent radius: 10 - color: Style.background_emphasize + color: Style.white opacity: 0.1 } } @@ -94,7 +94,7 @@ ColumnLayout { Layout.minimumHeight: 20 Layout.maximumHeight: 20 font.pixelSize: 16 - color: Style.content_accent_second + color: Style.active text: viewModel.currentStateHash elide: Text.ElideRight } @@ -103,7 +103,7 @@ ColumnLayout { Rectangle { anchors.fill: parent radius: 10 - color: Style.background_emphasize + color: Style.white opacity: 0.1 } } @@ -166,7 +166,7 @@ ColumnLayout { height: tableView.rowHeight readonly property var lineSeparator: "\n" property var texts: styleData.value.split(lineSeparator) - property color secondLineColor: Style.content_inconspicuous + property color secondLineColor: Style.content_secondary ColumnLayout { anchors.right: parent.right @@ -200,23 +200,23 @@ ColumnLayout { function getTextColor(texts) { if (texts[0] === "available") { - return Style.content_accent_second; + return Style.active; } else if (texts[0] == "maturing") { - return Style.content_accent_first; + return Style.accent_outgoing; } else if (texts[0] === "spent") { - return Style.content_accent_first; + return Style.accent_outgoing; } else if (texts[0] === "unavailable") { return Style.content_main; } else if (texts[0] === "in progress") { if (texts[1] === "(change)" || texts[1] === "(outgoing)") { - return Style.content_accent_first; + return Style.accent_outgoing; } else { - return Style.content_accent_third; + return Style.accent_incoming; } } else { @@ -248,7 +248,7 @@ ColumnLayout { Rectangle { anchors.fill: parent - color: Style.background_third + color: Style.background_row_even visible: styleData.alternate } } diff --git a/ui/view/wallet.qml b/ui/view/wallet.qml index 5e657768a..74c83fd64 100644 --- a/ui/view/wallet.qml +++ b/ui/view/wallet.qml @@ -69,7 +69,7 @@ Item { ConfirmationDialog { id: confirmationDialog - okButtonColor: Style.content_accent_first + okButtonColor: Style.accent_outgoing okButtonText: qsTr("send") okButtonIconSource: "qrc:/assets/icon-send-blue.svg" cancelButtonIconSource: "qrc:/assets/icon-cancel-white.svg" @@ -147,7 +147,7 @@ Item { Layout.fillHeight: true Layout.minimumHeight: 29 font.pixelSize: 24 - color: Style.content_accent_first + color: Style.accent_outgoing verticalAlignment: Text.AlignBottom } @@ -370,9 +370,9 @@ Item { CustomButton { text: qsTr("copy") - palette.buttonText: Style.background - icon.color: Style.background - palette.button: Style.content_accent_second + palette.buttonText: Style.content_opposite + icon.color: Style.content_opposite + palette.button: Style.active icon.source: "qrc:/assets/icon-copy.svg" onClicked: { viewModel.copyToClipboard(myAddressID.text); @@ -516,7 +516,7 @@ Item { font.pixelSize: 36 font.styleName: "Light"; font.weight: Font.Light - color: Style.content_accent_first + color: Style.accent_outgoing property double amount: 0 @@ -639,7 +639,7 @@ Item { font.pixelSize: 36 font.styleName: "Light"; font.weight: Font.Light - color: Style.content_accent_first + color: Style.accent_outgoing text: viewModel.defaultFeeInGroth.toLocaleString(Qt.locale(), 'f', -128) @@ -707,7 +707,7 @@ Item { Layout.alignment: Qt.AlignHCenter font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.content_inconspicuous + color: Style.content_secondary text: qsTr("Remaining") } @@ -720,7 +720,7 @@ Item { SFText { font.pixelSize: 24 font.styleName: "Light"; font.weight: Font.Light - color: Style.content_inconspicuous + color: Style.content_secondary text: viewModel.actualAvailable } @@ -739,7 +739,7 @@ Item { Layout.topMargin: 10 Layout.bottomMargin: 10 width: 1 - color: Style.content_inconspicuous + color: Style.content_secondary } Item { @@ -755,7 +755,7 @@ Item { Layout.alignment: Qt.AlignHCenter font.pixelSize: 18 font.styleName: "Bold"; font.weight: Font.Bold - color: Style.content_inconspicuous + color: Style.content_secondary text: qsTr("Change") } @@ -768,7 +768,7 @@ Item { SFText { font.pixelSize: 24 font.styleName: "Light"; font.weight: Font.Light - color: Style.content_inconspicuous + color: Style.content_secondary text: viewModel.change } @@ -785,7 +785,7 @@ Item { Rectangle { anchors.fill: parent radius: 10 - color: Style.background_emphasize + color: Style.white opacity: 0.1 } } @@ -814,8 +814,8 @@ Item { CustomButton { text: qsTr("send") - palette.buttonText: Style.background - palette.button: Style.content_accent_first + palette.buttonText: Style.content_opposite + palette.button: Style.accent_outgoing icon.source: "qrc:/assets/icon-send-blue.svg" enabled: {viewModel.isEnoughMoney && amount_input.amount > 0 && receiverAddrInput.acceptableInput } onClicked: { @@ -851,8 +851,8 @@ Item { spacing: 19 CustomButton { - palette.button: Style.content_accent_third - palette.buttonText: Style.background + palette.button: Style.accent_incoming + palette.buttonText: Style.content_opposite icon.source: "qrc:/assets/icon-receive-blue.svg" text: qsTr("receive") @@ -863,8 +863,8 @@ Item { } CustomButton { - palette.button: Style.content_accent_first - palette.buttonText: Style.background + palette.button: Style.accent_outgoing + palette.buttonText: Style.content_opposite icon.source: "qrc:/assets/icon-send-blue.svg" text: qsTr("send") @@ -1075,7 +1075,7 @@ Item { anchors.leftMargin: 20 anchors.right: parent.right anchors.left: parent.left - color: parent.income ? Style.content_accent_third : Style.content_accent_first + color: parent.income ? Style.accent_incoming : Style.accent_outgoing elide: Text.ElideRight anchors.verticalCenter: parent.verticalCenter font.pixelSize: 24 @@ -1145,7 +1145,7 @@ Item { if (viewModel.transactions[styleData.row].isSelfTx()) { return Style.content_main; } - return viewModel.transactions[styleData.row].income ? Style.content_accent_third : Style.content_accent_first; + return viewModel.transactions[styleData.row].income ? Style.accent_incoming : Style.accent_outgoing; } return Style.content_main; @@ -1239,6 +1239,12 @@ Item { property bool collapsed: true width: parent.width + Rectangle { + height: transactionsView.rowHeight + width: parent.width + color: Style.background_row_even + visible: styleData.alternate + } Column { id: rowColumn @@ -1246,7 +1252,7 @@ Item { Rectangle { height: transactionsView.rowHeight width: parent.width - color: styleData.alternate ? Style.background_second : Style.background_third + color: "transparent" } Item { id: txDetails @@ -1266,7 +1272,7 @@ Item { Rectangle { anchors.fill: parent - color: Style.background_fourth + color: Style.background_details } TransactionDetails { id: detailsPanel From 7885f3f11ccaac0501c1ada2cb97724a5bcbdfd1 Mon Sep 17 00:00:00 2001 From: szavarza Date: Mon, 1 Apr 2019 19:52:07 +0300 Subject: [PATCH 062/136] #559 cli options moved to separate lib --- beam/CMakeLists.txt | 8 ++++---- beam/cli.cpp | 2 +- explorer/CMakeLists.txt | 4 ++-- explorer/explorer_node.cpp | 8 ++++---- pow/CMakeLists.txt | 10 ++++++++-- ui/CMakeLists.txt | 4 ++-- ui/ui.cpp | 2 +- utility/CMakeLists.txt | 21 ++++++++++++++------- utility/{ => cli}/options.cpp | 0 utility/{ => cli}/options.h | 2 +- wallet/CMakeLists.txt | 20 ++++++++++---------- wallet/api_cli.cpp | 10 +++++----- wallet/cli.cpp | 2 +- 13 files changed, 53 insertions(+), 40 deletions(-) rename utility/{ => cli}/options.cpp (100%) rename utility/{ => cli}/options.h (99%) diff --git a/beam/CMakeLists.txt b/beam/CMakeLists.txt index 2898706a1..0be3c0a4f 100644 --- a/beam/CMakeLists.txt +++ b/beam/CMakeLists.txt @@ -9,12 +9,12 @@ endif() configure_file("${PROJECT_SOURCE_DIR}/version.h.in" "${CMAKE_CURRENT_BINARY_DIR}/version.h") target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -add_dependencies(${TARGET_NAME} node external_pow) -target_link_libraries(${TARGET_NAME} node external_pow) +add_dependencies(${TARGET_NAME} node external_pow cli) +target_link_libraries(${TARGET_NAME} node external_pow cli) if (BEAM_SIGN_PACKAGE AND WIN32) - add_custom_command( - TARGET ${TARGET_NAME} POST_BUILD + add_custom_command( + TARGET ${TARGET_NAME} POST_BUILD COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\${TARGET_NAME}.exe" ) endif() diff --git a/beam/cli.cpp b/beam/cli.cpp index 24ceff196..d4b4a927e 100644 --- a/beam/cli.cpp +++ b/beam/cli.cpp @@ -19,8 +19,8 @@ #include "core/ecc_native.h" #include "core/ecc.h" #include "core/serialization_adapters.h" +#include "utility/cli/options.h" #include "utility/log_rotation.h" -#include "utility/options.h" #include "utility/helpers.h" #include diff --git a/explorer/CMakeLists.txt b/explorer/CMakeLists.txt index f6e415a0d..ccccf6dee 100644 --- a/explorer/CMakeLists.txt +++ b/explorer/CMakeLists.txt @@ -14,8 +14,8 @@ target_link_libraries(explorer node http) add_executable(${TARGET_NAME} explorer_node.cpp) target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -add_dependencies(${TARGET_NAME} explorer) -target_link_libraries(${TARGET_NAME} explorer) +add_dependencies(${TARGET_NAME} explorer cli) +target_link_libraries(${TARGET_NAME} explorer cli) add_subdirectory(unittest) diff --git a/explorer/explorer_node.cpp b/explorer/explorer_node.cpp index 9fef7eb99..0f362abe0 100644 --- a/explorer/explorer_node.cpp +++ b/explorer/explorer_node.cpp @@ -4,9 +4,9 @@ #include "core/ecc_native.h" #include "node/node.h" +#include "utility/cli/options.h" #include "utility/logger.h" #include "utility/helpers.h" -#include "utility/options.h" #include "utility/string_helpers.h" #include "utility/log_rotation.h" @@ -157,9 +157,9 @@ bool parse_cmdline(int argc, char* argv[], Options& o) { } } -#ifdef WIN32 - WSADATA wsaData = { }; - WSAStartup(MAKEWORD(2, 2), &wsaData); +#ifdef WIN32 + WSADATA wsaData = { }; + WSAStartup(MAKEWORD(2, 2), &wsaData); #endif std::string whitelist = vm[cli::IP_WHITELIST].as(); diff --git a/pow/CMakeLists.txt b/pow/CMakeLists.txt index 779cd36d8..a293c33da 100644 --- a/pow/CMakeLists.txt +++ b/pow/CMakeLists.txt @@ -36,7 +36,13 @@ add_dependencies(external_pow core p2p pow) target_link_libraries(external_pow p2p pow core) add_executable(miner_client miner_client.cpp ../core/block_crypt.cpp) # ??????????????????????????? -add_dependencies(miner_client external_pow) -target_link_libraries(miner_client external_pow) +if (Boost_FOUND) + find_package(Boost COMPONENTS program_options) + add_dependencies(miner_client external_pow Boost::program_options) + target_link_libraries(miner_client external_pow Boost::program_options) + else() + add_dependencies(miner_client external_pow boost_program_options) + target_link_libraries(miner_client external_pow boost_program_options) + endif() add_subdirectory(unittests) diff --git a/ui/CMakeLists.txt b/ui/CMakeLists.txt index eadd8ef86..f1e258c6d 100644 --- a/ui/CMakeLists.txt +++ b/ui/CMakeLists.txt @@ -115,8 +115,8 @@ set_target_properties(${TARGET_NAME} PROPERTIES OUTPUT_NAME ${OUTPUT_NAME}) configure_file("${PROJECT_SOURCE_DIR}/version.h.in" "${CMAKE_CURRENT_BINARY_DIR}/version.h") -add_dependencies(${TARGET_NAME} wallet mnemonic qrcode) -target_link_libraries(${TARGET_NAME} qrcode) +add_dependencies(${TARGET_NAME} wallet mnemonic qrcode cli) +target_link_libraries(${TARGET_NAME} qrcode cli) if(LINUX) set(CMAKE_POSITION_INDEPENDENT_CODE ON) diff --git a/ui/ui.cpp b/ui/ui.cpp index bb424507b..846ffa1d6 100644 --- a/ui/ui.cpp +++ b/ui/ui.cpp @@ -41,7 +41,7 @@ #include "translator.h" -#include "utility/options.h" +#include "utility/cli/options.h" #include diff --git a/utility/CMakeLists.txt b/utility/CMakeLists.txt index 25249e1b9..100e5b6b2 100644 --- a/utility/CMakeLists.txt +++ b/utility/CMakeLists.txt @@ -5,12 +5,13 @@ set(UTILITY_SRC log_rotation.cpp helpers.cpp config.cpp - options.cpp string_helpers.cpp asynccontext.cpp # ~etc ) +set(CLI_SRC cli/options.cpp) + set(IO_SRC io/buffer.cpp io/bufferchain.cpp @@ -52,6 +53,10 @@ else() add_library(crypto STATIC ${PROJECT_SOURCE_DIR}/3rdparty/crypto/blake/sse/blake2b.cpp) endif() +if(NOT ANDROID) + add_library(cli STATIC ${CLI_SRC}) +endif() + if (UV_INTERNAL) add_dependencies(utility uv_a) target_link_libraries(utility uv_a) @@ -70,22 +75,22 @@ target_link_libraries(utility mnemonic) if(ANDROID) if(ANDROID_ABI STREQUAL "armeabi-v7a") target_link_libraries(utility - $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-a32-1_68.a + # $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-a32-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_filesystem-clang-mt-a32-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_system-clang-mt-a32-1_68.a) elseif(ANDROID_ABI STREQUAL "x86") target_link_libraries(utility - $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-x32-1_68.a + # $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-x32-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_filesystem-clang-mt-x32-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_system-clang-mt-x32-1_68.a) elseif(ANDROID_ABI STREQUAL "x86_64") target_link_libraries(utility - $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-x64-1_68.a + # $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-x64-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_filesystem-clang-mt-x64-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_system-clang-mt-x64-1_68.a) elseif(ANDROID_ABI STREQUAL "arm64-v8a") target_link_libraries(utility - $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-a64-1_68.a + # $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-a64-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_filesystem-clang-mt-a64-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_system-clang-mt-a64-1_68.a) endif() @@ -93,9 +98,11 @@ if(ANDROID) else() if (Boost_FOUND) find_package(Boost COMPONENTS program_options filesystem) - target_link_libraries(utility Boost::program_options Boost::filesystem) + target_link_libraries(utility Boost::filesystem) + target_link_libraries(cli Boost::program_options) else() - target_link_libraries(utility boost_program_options boost_filesystem boost_system) + target_link_libraries(utility boost_filesystem boost_system) + target_link_libraries(cli boost_program_options) endif() endif() diff --git a/utility/options.cpp b/utility/cli/options.cpp similarity index 100% rename from utility/options.cpp rename to utility/cli/options.cpp diff --git a/utility/options.h b/utility/cli/options.h similarity index 99% rename from utility/options.h rename to utility/cli/options.h index d6fe028fe..f93301858 100644 --- a/utility/options.h +++ b/utility/cli/options.h @@ -16,7 +16,7 @@ #include #include "core/ecc.h" -#include "logger.h" +#include "utility/logger.h" namespace beam { diff --git a/wallet/CMakeLists.txt b/wallet/CMakeLists.txt index 1bdf1b7ff..6266a8c0c 100644 --- a/wallet/CMakeLists.txt +++ b/wallet/CMakeLists.txt @@ -32,8 +32,8 @@ endif() configure_file("${PROJECT_SOURCE_DIR}/version.h.in" "${CMAKE_CURRENT_BINARY_DIR}/version.h") target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -add_dependencies(${TARGET_NAME} wallet utility) -target_link_libraries(${TARGET_NAME} wallet utility) +add_dependencies(${TARGET_NAME} wallet utility cli) +target_link_libraries(${TARGET_NAME} wallet utility cli) add_library(wallet_api_proto STATIC api.cpp) add_dependencies(wallet_api_proto wallet utility http) @@ -43,8 +43,8 @@ set(WALLET_API_NAME wallet-api${BEAM_TARGET_SUFFIX}) add_executable(${WALLET_API_NAME} api_cli.cpp) target_include_directories(${WALLET_API_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -add_dependencies(${WALLET_API_NAME} wallet utility wallet_api_proto) -target_link_libraries(${WALLET_API_NAME} wallet utility wallet_api_proto) +add_dependencies(${WALLET_API_NAME} wallet utility wallet_api_proto cli) +target_link_libraries(${WALLET_API_NAME} wallet utility wallet_api_proto cli) if(LINUX) target_link_libraries(${WALLET_API_NAME} -static-libstdc++ -static-libgcc) @@ -53,12 +53,12 @@ endif() add_subdirectory(unittests) if (BEAM_SIGN_PACKAGE AND WIN32) - add_custom_command( - TARGET ${TARGET_NAME} POST_BUILD - COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\{TARGET_NAME}.exe" + add_custom_command( + TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\{TARGET_NAME}.exe" ) - add_custom_command( - TARGET ${WALLET_API_NAME} POST_BUILD - COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\${WALLET_API_NAME}.exe" + add_custom_command( + TARGET ${WALLET_API_NAME} POST_BUILD + COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\${WALLET_API_NAME}.exe" ) endif() \ No newline at end of file diff --git a/wallet/api_cli.cpp b/wallet/api_cli.cpp index 05c6dce6c..7603c4fe5 100644 --- a/wallet/api_cli.cpp +++ b/wallet/api_cli.cpp @@ -22,12 +22,12 @@ #include #include +#include "utility/cli/options.h" #include "utility/helpers.h" #include "utility/io/timer.h" #include "utility/io/tcpserver.h" #include "utility/io/sslserver.h" #include "utility/io/json_serializer.h" -#include "utility/options.h" #include "utility/string_helpers.h" #include "utility/log_rotation.h" @@ -140,9 +140,9 @@ namespace beam try { - _server = _tlsOptions.use - ? io::SslServer::create(_reactor, _bindAddress, BIND_THIS_MEMFN(on_stream_accepted), _tlsOptions.certPath.c_str(), _tlsOptions.keyPath.c_str()) - : io::TcpServer::create(_reactor, _bindAddress, BIND_THIS_MEMFN(on_stream_accepted)); + _server = _tlsOptions.use + ? io::SslServer::create(_reactor, _bindAddress, BIND_THIS_MEMFN(on_stream_accepted), _tlsOptions.certPath.c_str(), _tlsOptions.keyPath.c_str()) + : io::TcpServer::create(_reactor, _bindAddress, BIND_THIS_MEMFN(on_stream_accepted)); } catch (const std::exception& e) @@ -169,7 +169,7 @@ namespace beam { for (auto id : _pendingToClose) { - _connections.erase(id); + _connections.erase(id); } _pendingToClose.clear(); diff --git a/wallet/cli.cpp b/wallet/cli.cpp index b74548663..8140a8e90 100644 --- a/wallet/cli.cpp +++ b/wallet/cli.cpp @@ -30,8 +30,8 @@ #define LOG_VERBOSE_ENABLED 0 #endif +#include "utility/cli/options.h" #include "utility/log_rotation.h" -#include "utility/options.h" #include "utility/helpers.h" #include From dbcf20d9dbe969a8c4282439f06eda16b8aa1af8 Mon Sep 17 00:00:00 2001 From: szavarza Date: Tue, 2 Apr 2019 15:47:53 +0300 Subject: [PATCH 063/136] #559 codestyle fixes # Conflicts: # pow/CMakeLists.txt # utility/CMakeLists.txt # wallet/CMakeLists.txt --- pow/CMakeLists.txt | 10 ++++--- utility/CMakeLists.txt | 4 --- wallet/CMakeLists.txt | 64 ++++++++++++++++++++++-------------------- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/pow/CMakeLists.txt b/pow/CMakeLists.txt index a293c33da..3f5b75587 100644 --- a/pow/CMakeLists.txt +++ b/pow/CMakeLists.txt @@ -35,14 +35,16 @@ add_library(external_pow STATIC add_dependencies(external_pow core p2p pow) target_link_libraries(external_pow p2p pow core) -add_executable(miner_client miner_client.cpp ../core/block_crypt.cpp) # ??????????????????????????? -if (Boost_FOUND) +if (NOT ANDROID) + add_executable(miner_client miner_client.cpp ../core/block_crypt.cpp) # ??????????????????????????? + if (Boost_FOUND) find_package(Boost COMPONENTS program_options) add_dependencies(miner_client external_pow Boost::program_options) - target_link_libraries(miner_client external_pow Boost::program_options) + target_link_libraries(miner_client external_pow Boost::program_options) else() add_dependencies(miner_client external_pow boost_program_options) target_link_libraries(miner_client external_pow boost_program_options) endif() -add_subdirectory(unittests) + add_subdirectory(unittests) +endif() diff --git a/utility/CMakeLists.txt b/utility/CMakeLists.txt index 100e5b6b2..669f21cf2 100644 --- a/utility/CMakeLists.txt +++ b/utility/CMakeLists.txt @@ -75,22 +75,18 @@ target_link_libraries(utility mnemonic) if(ANDROID) if(ANDROID_ABI STREQUAL "armeabi-v7a") target_link_libraries(utility - # $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-a32-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_filesystem-clang-mt-a32-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_system-clang-mt-a32-1_68.a) elseif(ANDROID_ABI STREQUAL "x86") target_link_libraries(utility - # $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-x32-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_filesystem-clang-mt-x32-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_system-clang-mt-x32-1_68.a) elseif(ANDROID_ABI STREQUAL "x86_64") target_link_libraries(utility - # $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-x64-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_filesystem-clang-mt-x64-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_system-clang-mt-x64-1_68.a) elseif(ANDROID_ABI STREQUAL "arm64-v8a") target_link_libraries(utility - # $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-a64-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_filesystem-clang-mt-a64-1_68.a $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_system-clang-mt-a64-1_68.a) endif() diff --git a/wallet/CMakeLists.txt b/wallet/CMakeLists.txt index 6266a8c0c..b95643797 100644 --- a/wallet/CMakeLists.txt +++ b/wallet/CMakeLists.txt @@ -21,44 +21,46 @@ add_library(wallet STATIC ${WALLET_SRC}) add_dependencies(wallet core p2p sqlite) target_link_libraries(wallet core p2p sqlite) -add_executable(${TARGET_NAME} cli.cpp) +if (NOT ANDROID) + add_executable(${TARGET_NAME} cli.cpp) -target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/external) + target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/external) -if(LINUX) - target_link_libraries(${TARGET_NAME} -static-libstdc++ -static-libgcc) -endif() + if(LINUX) + target_link_libraries(${TARGET_NAME} -static-libstdc++ -static-libgcc) + endif() -configure_file("${PROJECT_SOURCE_DIR}/version.h.in" "${CMAKE_CURRENT_BINARY_DIR}/version.h") -target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + configure_file("${PROJECT_SOURCE_DIR}/version.h.in" "${CMAKE_CURRENT_BINARY_DIR}/version.h") + target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -add_dependencies(${TARGET_NAME} wallet utility cli) -target_link_libraries(${TARGET_NAME} wallet utility cli) + add_dependencies(${TARGET_NAME} wallet utility cli) + target_link_libraries(${TARGET_NAME} wallet utility cli) -add_library(wallet_api_proto STATIC api.cpp) -add_dependencies(wallet_api_proto wallet utility http) -target_link_libraries(wallet_api_proto wallet utility http) + add_library(wallet_api_proto STATIC api.cpp) + add_dependencies(wallet_api_proto wallet utility http) + target_link_libraries(wallet_api_proto wallet utility http) -set(WALLET_API_NAME wallet-api${BEAM_TARGET_SUFFIX}) + set(WALLET_API_NAME wallet-api${BEAM_TARGET_SUFFIX}) -add_executable(${WALLET_API_NAME} api_cli.cpp) -target_include_directories(${WALLET_API_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -add_dependencies(${WALLET_API_NAME} wallet utility wallet_api_proto cli) -target_link_libraries(${WALLET_API_NAME} wallet utility wallet_api_proto cli) + add_executable(${WALLET_API_NAME} api_cli.cpp) + target_include_directories(${WALLET_API_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + add_dependencies(${WALLET_API_NAME} wallet utility wallet_api_proto cli) + target_link_libraries(${WALLET_API_NAME} wallet utility wallet_api_proto cli) -if(LINUX) - target_link_libraries(${WALLET_API_NAME} -static-libstdc++ -static-libgcc) -endif() + if(LINUX) + target_link_libraries(${WALLET_API_NAME} -static-libstdc++ -static-libgcc) + endif() -add_subdirectory(unittests) + add_subdirectory(unittests) -if (BEAM_SIGN_PACKAGE AND WIN32) - add_custom_command( - TARGET ${TARGET_NAME} POST_BUILD - COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\{TARGET_NAME}.exe" - ) - add_custom_command( - TARGET ${WALLET_API_NAME} POST_BUILD - COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\${WALLET_API_NAME}.exe" - ) -endif() \ No newline at end of file + if (BEAM_SIGN_PACKAGE AND WIN32) + add_custom_command( + TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\{TARGET_NAME}.exe" + ) + add_custom_command( + TARGET ${WALLET_API_NAME} POST_BUILD + COMMAND ${SIGNTOOL_EXECUTABLE} sign ${SIGNTOOL_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}\\${WALLET_API_NAME}.exe" + ) + endif() +endif() From afca7460a778699598670838a6ed6e9f832f56d3 Mon Sep 17 00:00:00 2001 From: szavarza Date: Tue, 16 Apr 2019 16:47:21 +0300 Subject: [PATCH 064/136] #463 colors fix for settings tab buttons --- ui/view/color_themes/AbstractColors.qml | 1 + ui/view/color_themes/Mainnet.qml | 1 + ui/view/color_themes/Masternet.qml | 1 + ui/view/color_themes/Testnet.qml | 1 + ui/view/settings.qml | 10 +++++----- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ui/view/color_themes/AbstractColors.qml b/ui/view/color_themes/AbstractColors.qml index b1a4c95c8..e0c1a36bd 100644 --- a/ui/view/color_themes/AbstractColors.qml +++ b/ui/view/color_themes/AbstractColors.qml @@ -15,6 +15,7 @@ QtObject { property color background_second; property color background_row_even; property color background_details; + property color background_button; property color row_selected; property color separator; diff --git a/ui/view/color_themes/Mainnet.qml b/ui/view/color_themes/Mainnet.qml index a1b1b4ff9..2bdbd29b4 100644 --- a/ui/view/color_themes/Mainnet.qml +++ b/ui/view/color_themes/Mainnet.qml @@ -16,6 +16,7 @@ AbstractColors { property color background_second: "#1c435b" // dark-slate-blue property color background_row_even: "#0e3850" // light-navy property color background_details: "#09425e" + property color background_button: "#708090" property color row_selected: "#085469" property color separator: "#33566b" diff --git a/ui/view/color_themes/Masternet.qml b/ui/view/color_themes/Masternet.qml index 3272e54de..fd12f7f84 100644 --- a/ui/view/color_themes/Masternet.qml +++ b/ui/view/color_themes/Masternet.qml @@ -15,6 +15,7 @@ AbstractColors { property color background_second: "#323232" property color background_row_even: "#242424" property color background_details: "#3d3d3d" + property color background_button: "#708090" property color row_selected: "#353636" property color separator: "#353636" diff --git a/ui/view/color_themes/Testnet.qml b/ui/view/color_themes/Testnet.qml index 79841a3f7..ad7f58e75 100644 --- a/ui/view/color_themes/Testnet.qml +++ b/ui/view/color_themes/Testnet.qml @@ -15,6 +15,7 @@ AbstractColors { property color background_second: "#342e41" property color background_row_even: "#292236" property color background_details: "#3e384a" + property color background_button: "#708090" property color row_selected: "#534e5e" property color separator: "#342e41" diff --git a/ui/view/settings.qml b/ui/view/settings.qml index b014a12a3..0d0bc71a7 100644 --- a/ui/view/settings.qml +++ b/ui/view/settings.qml @@ -225,7 +225,7 @@ Rectangle { leftPadding: 20 rightPadding: 20 text: "Add" - palette.button: Style.background_inconspicuous + palette.button: Style.background_button palette.buttonText : localNodeRun.checked ? Style.content_main : Style.content_disabled enabled: newLocalNodePeer.acceptableInput && localNodeRun.checked onClicked: { @@ -392,7 +392,7 @@ Rectangle { CustomButton { text: "change wallet password" palette.buttonText : "white" - palette.button: Style.background_inconspicuous + palette.button: Style.background_button icon.source: "qrc:/assets/icon-password.svg" icon.width: 16 icon.height: 16 @@ -469,7 +469,7 @@ Rectangle { CustomButton { text: "save wallet logs" palette.buttonText : "white" - palette.button: Style.background_inconspicuous + palette.button: Style.background_button onClicked: viewModel.reportProblem() } spacing: 30 @@ -477,7 +477,7 @@ Rectangle { icon.source: "qrc:/assets/icon-restore.svg" Layout.alignment: Qt.AlignRight text: qsTr("rescan") - palette.button: Style.background_inconspicuous + palette.button: Style.background_button palette.buttonText : localNodeRun.checked ? Style.content_main : Style.content_disabled enabled: localNodeRun.checked && confirmRefreshDialog.canRefresh && viewModel.isLocalNodeRunning onClicked: { @@ -510,7 +510,7 @@ Rectangle { text: qsTr("copy") icon.color: Style.content_main palette.buttonText : Style.content_main - palette.button: Style.background_inconspicuous + palette.button: Style.background_button icon.source: "qrc:/assets/icon-copy.svg" onClicked: { viewModel.copyToClipboard(viewModel.walletLocation); From 3d7fa76ee5b512b21fc3fadbabd5c7dcb7529b62 Mon Sep 17 00:00:00 2001 From: Vadim Grigoruk Date: Wed, 10 Apr 2019 19:18:19 +0300 Subject: [PATCH 065/136] added builds uploading to the "latest" folder added builds uploading to the "latest" folder --- .travis.yml | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 50f72bc80..1da026256 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,6 +30,7 @@ matrix: - echo BEAM_VERSION = $BEAM_VERSION - export BEAM_WALLET_UI_IN="BeamWallet$BEAM_DISPLAY_SUFFIX-$BEAM_VERSION-Darwin.dmg" - export BEAM_WALLET_UI_OUT="Beam-Wallet$BEAM_DISPLAY_SUFFIX2-$BEAM_VERSION.dmg" + - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet$BEAM_DISPLAY_SUFFIX2.dmg" ############################################################################### # OSX Release @@ -70,6 +71,7 @@ matrix: - echo BEAM_VERSION = $BEAM_VERSION - export BEAM_WALLET_UI_IN="BeamWallet$BEAM_DISPLAY_SUFFIX-$BEAM_VERSION-Darwin.dmg" - export BEAM_WALLET_UI_OUT="Beam-Wallet$BEAM_DISPLAY_SUFFIX2-$BEAM_VERSION.dmg" + - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet$BEAM_DISPLAY_SUFFIX2.dmg" # sign our builds - codesign --force --deep --sign "$MACOS_SIGN_IDENTITY" beam/beam-node$BEAM_TARGET_SUFFIX - codesign --force --deep --sign "$MACOS_SIGN_IDENTITY" wallet/beam-wallet$BEAM_TARGET_SUFFIX @@ -111,6 +113,7 @@ matrix: - echo BEAM_VERSION = $BEAM_VERSION - export BEAM_WALLET_UI_IN="BeamWallet$BEAM_DISPLAY_SUFFIX-$BEAM_VERSION-Linux.deb" - export BEAM_WALLET_UI_OUT="Beam-Wallet$BEAM_DISPLAY_SUFFIX2-$BEAM_VERSION.deb" + - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet$BEAM_DISPLAY_SUFFIX2.deb" ############################################################################### # Linux Release ############################################################################### @@ -146,6 +149,7 @@ matrix: - echo BEAM_VERSION = $BEAM_VERSION - export BEAM_WALLET_UI_IN="BeamWallet$BEAM_DISPLAY_SUFFIX-$BEAM_VERSION-Linux.deb" - export BEAM_WALLET_UI_OUT="Beam-Wallet$BEAM_DISPLAY_SUFFIX2-$BEAM_VERSION.deb" + - export BEAM_WALLET_UI_OUT_VERLESS="Beam-Wallet$BEAM_DISPLAY_SUFFIX2.deb" ############################################################################### # Android x86 Release @@ -311,10 +315,7 @@ after_success: - tar -cvzf beam-wallet-cli$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/wallet beam-wallet$BEAM_TARGET_SUFFIX beam-wallet.cfg - tar -cvzf wallet-api$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/wallet wallet-api$BEAM_TARGET_SUFFIX wallet-api.cfg - tar -cvzf explorer-node$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/explorer explorer-node$BEAM_TARGET_SUFFIX explorer-node.cfg - - # prep for deploy to AWS S3 - - cp $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_IN $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_OUT - + # upload binaries to FTP - curl --retry 3 --ftp-create-dirs -T beam-node$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - curl --retry 3 --ftp-create-dirs -T beam-wallet-cli$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ @@ -322,6 +323,17 @@ after_success: - curl --retry 3 --ftp-create-dirs -T explorer-node$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - curl --retry 3 --ftp-create-dirs -T "$HOME/build/BeamMW/beam/$BEAM_WALLET_UI_IN" "$BUILDS_SERVER_PATH/$BEAM_WALLET_UI_OUT" + # upload binaries to FTP, to the latest folder + - BUILDS_SERVER_LATEST_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/latest/$BUILD_TYPE/$OS_FOLDER + - curl --retry 3 --ftp-create-dirs -T beam-node$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz $BUILDS_SERVER_LATEST_PATH/beam-node$BEAM_TARGET_SUFFIX.tar.gz + - curl --retry 3 --ftp-create-dirs -T beam-wallet-cli$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz $BUILDS_SERVER_LATEST_PATH/beam-wallet-cli$BEAM_TARGET_SUFFIX.tar.gz + - curl --retry 3 --ftp-create-dirs -T wallet-api$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz $BUILDS_SERVER_LATEST_PATH/wallet-api$BEAM_TARGET_SUFFIX.tar.gz + - curl --retry 3 --ftp-create-dirs -T explorer-node$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz $BUILDS_SERVER_LATEST_PATH/explorer-node$BEAM_TARGET_SUFFIX.tar.gz + - curl --retry 3 --ftp-create-dirs -T "$HOME/build/BeamMW/beam/$BEAM_WALLET_UI_IN" "$BUILDS_SERVER_LATEST_PATH/$BEAM_WALLET_UI_OUT_VERLESS" + + # prep for deploy to AWS S3 + - cp $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_IN $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_OUT + # upload binaries to S3 - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" beam-node$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" beam-wallet-cli$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz @@ -329,6 +341,20 @@ after_success: - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" explorer-node$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_OUT + # prep for deploy to AWS S3, latest folder + - cp beam-node$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz beam-node$BEAM_TARGET_SUFFIX.tar.gz + - cp beam-wallet-cli$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz beam-wallet-cli$BEAM_TARGET_SUFFIX.tar.gz + - cp wallet-api$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz wallet-api$BEAM_TARGET_SUFFIX.tar.gz + - cp explorer-node$BEAM_TARGET_SUFFIX-$BEAM_VERSION.tar.gz explorer-node$BEAM_TARGET_SUFFIX.tar.gz + - cp $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_IN $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_OUT_VERLESS + + # upload binaries to S3, to the latest folder + - artifacts upload --target-paths "$TRAVIS_BRANCH/latest/$BUILD_TYPE/$OS_FOLDER/" beam-node$BEAM_TARGET_SUFFIX.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/latest/$BUILD_TYPE/$OS_FOLDER/" beam-wallet-cli$BEAM_TARGET_SUFFIX.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/latest/$BUILD_TYPE/$OS_FOLDER/" wallet-api$BEAM_TARGET_SUFFIX.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/latest/$BUILD_TYPE/$OS_FOLDER/" explorer-node$BEAM_TARGET_SUFFIX.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/latest/$BUILD_TYPE/$OS_FOLDER/" $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_OUT_VERLESS + notifications: email: - big.romanov@gmail.com \ No newline at end of file From ed050e553bfce703bacfce4cbe14123f58ad736c Mon Sep 17 00:00:00 2001 From: Anatol Date: Mon, 29 Apr 2019 14:29:42 +0300 Subject: [PATCH 066/136] upload android lobs to latest --- .travis.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.travis.yml b/.travis.yml index 1da026256..a362cb824 100644 --- a/.travis.yml +++ b/.travis.yml @@ -184,9 +184,12 @@ matrix: - BEAM_VERSION="$(cat beam_version.gen)" && rm beam_version.gen - echo BEAM_VERSION = $BEAM_VERSION - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI + - BUILDS_SERVER_LATEST_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI - tar -cvzf libwallet-jni-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com - curl --retry 3 --ftp-create-dirs -T libwallet-jni-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ + - curl --retry 3 --ftp-create-dirs -T libwallet-jni.tar.gz $BUILDS_SERVER_LATEST_PATH/ - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni-$BEAM_VERSION.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni.tar.gz ############################################################################### # Android x86_64 Release @@ -221,9 +224,12 @@ matrix: - BEAM_VERSION="$(cat beam_version.gen)" && rm beam_version.gen - echo BEAM_VERSION = $BEAM_VERSION - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI + - BUILDS_SERVER_LATEST_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI - tar -cvzf libwallet-jni-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com - curl --retry 3 --ftp-create-dirs -T libwallet-jni-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ + - curl --retry 3 --ftp-create-dirs -T libwallet-jni.tar.gz $BUILDS_SERVER_LATEST_PATH/ - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni-$BEAM_VERSION.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni.tar.gz ############################################################################### # Android ARMv7 Release @@ -258,9 +264,12 @@ matrix: - BEAM_VERSION="$(cat beam_version.gen)" && rm beam_version.gen - echo BEAM_VERSION = $BEAM_VERSION - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI + - BUILDS_SERVER_LATEST_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI - tar -cvzf libwallet-jni-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com - curl --retry 3 --ftp-create-dirs -T libwallet-jni-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ + - curl --retry 3 --ftp-create-dirs -T libwallet-jni.tar.gz $BUILDS_SERVER_LATEST_PATH/ - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni-$BEAM_VERSION.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni.tar.gz ############################################################################### # Android ARMv8 Release @@ -295,9 +304,12 @@ matrix: - BEAM_VERSION="$(cat beam_version.gen)" && rm beam_version.gen - echo BEAM_VERSION = $BEAM_VERSION - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI + - BUILDS_SERVER_LATEST_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI - tar -cvzf libwallet-jni-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com - curl --retry 3 --ftp-create-dirs -T libwallet-jni-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ + - curl --retry 3 --ftp-create-dirs -T libwallet-jni.tar.gz $BUILDS_SERVER_LATEST_PATH/ - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni-$BEAM_VERSION.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni.tar.gzz ############################################################################### # Common part From 1a0abcd912d480d8769dc7fcd855472b5737b0e6 Mon Sep 17 00:00:00 2001 From: Anatol Date: Tue, 30 Apr 2019 11:24:52 +0300 Subject: [PATCH 067/136] travis artifacts upload fix --- .travis.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a362cb824..68553d276 100644 --- a/.travis.yml +++ b/.travis.yml @@ -186,6 +186,7 @@ matrix: - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI - BUILDS_SERVER_LATEST_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI - tar -cvzf libwallet-jni-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com + - tar -cvzf libwallet-jni.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com - curl --retry 3 --ftp-create-dirs -T libwallet-jni-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - curl --retry 3 --ftp-create-dirs -T libwallet-jni.tar.gz $BUILDS_SERVER_LATEST_PATH/ - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni-$BEAM_VERSION.tar.gz @@ -226,6 +227,7 @@ matrix: - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI - BUILDS_SERVER_LATEST_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI - tar -cvzf libwallet-jni-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com + - tar -cvzf libwallet-jni.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com - curl --retry 3 --ftp-create-dirs -T libwallet-jni-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - curl --retry 3 --ftp-create-dirs -T libwallet-jni.tar.gz $BUILDS_SERVER_LATEST_PATH/ - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni-$BEAM_VERSION.tar.gz @@ -266,6 +268,7 @@ matrix: - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI - BUILDS_SERVER_LATEST_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI - tar -cvzf libwallet-jni-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com + - tar -cvzf libwallet-jni.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com - curl --retry 3 --ftp-create-dirs -T libwallet-jni-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - curl --retry 3 --ftp-create-dirs -T libwallet-jni.tar.gz $BUILDS_SERVER_LATEST_PATH/ - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni-$BEAM_VERSION.tar.gz @@ -306,10 +309,11 @@ matrix: - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI - BUILDS_SERVER_LATEST_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI - tar -cvzf libwallet-jni-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com + - tar -cvzf libwallet-jni.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com - curl --retry 3 --ftp-create-dirs -T libwallet-jni-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - curl --retry 3 --ftp-create-dirs -T libwallet-jni.tar.gz $BUILDS_SERVER_LATEST_PATH/ - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni-$BEAM_VERSION.tar.gz - - artifacts upload --target-paths "$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni.tar.gzz + - artifacts upload --target-paths "$TRAVIS_BRANCH/latest/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni.tar.gz ############################################################################### # Common part From a80fab945330c9346828a4fd351d856e64e439db Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Tue, 2 Apr 2019 10:27:41 +0300 Subject: [PATCH 068/136] # android buil fixes --- CMakeLists.txt | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 71b421191..0ebac0e01 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -304,8 +304,6 @@ add_subdirectory(p2p) add_subdirectory(http) add_subdirectory(wallet) add_subdirectory(node) -add_subdirectory(beam) -add_subdirectory(explorer) add_subdirectory(mnemonic) if(ANDROID OR BEAM_BUILD_JNI) @@ -313,11 +311,16 @@ if(ANDROID OR BEAM_BUILD_JNI) endif() # TODO: uncomment this later -if(NOT ANDROID AND BEAM_QT_UI_WALLET) - add_subdirectory(3rdparty/qrcode) - add_subdirectory(3rdparty/quazip) - add_subdirectory(ui) -endif() +if(NOT ANDROID) + add_subdirectory(beam) + add_subdirectory(explorer) + + if(BEAM_QT_UI_WALLET) + add_subdirectory(3rdparty/qrcode) + add_subdirectory(3rdparty/quazip) + add_subdirectory(ui) + endif() + endif() ######################################################## ### PACKAGING ########################################## From 8934279748513e80fb448e6a6921355a087ca374 Mon Sep 17 00:00:00 2001 From: zavarza Date: Sat, 11 May 2019 17:41:47 +0300 Subject: [PATCH 069/136] #632 translations compilations fixed --- .gitignore | 2 ++ ui/CMakeLists.txt | 73 +++++++++++++++++++++++++---------------------- 2 files changed, 41 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index e65be1a5b..7ba7c0696 100644 --- a/.gitignore +++ b/.gitignore @@ -104,4 +104,6 @@ ui/beam.icns ui/icon.ico ui/Info.plist ui/beam.desktop +ui/*.qm +ui/translations.qrc beam_version.gen diff --git a/ui/CMakeLists.txt b/ui/CMakeLists.txt index a7e26347b..f2d37e7d8 100644 --- a/ui/CMakeLists.txt +++ b/ui/CMakeLists.txt @@ -1,5 +1,29 @@ set (TARGET_NAME "beam-wallet-ui") +function(BEAM_TRANSLATIONS_UPDATE_TS supported_langs out_ts_files) + find_package(Qt5LinguistTools) + foreach(SUPPORTED_LANG ${supported_langs}) + set(TS_FILE "${CMAKE_CURRENT_SOURCE_DIR}/i18n/${SUPPORTED_LANG}.ts") + list(APPEND TS_FILES "${TS_FILE}") + message("update: ${TS_FILE}") + execute_process(COMMAND lupdate -recursive -locations none ${CMAKE_CURRENT_SOURCE_DIR} -ts "${TS_FILE}") + endforeach() + set(${out_ts_files} ${TS_FILES} PARENT_SCOPE) +endfunction() + +function(BEAM_TRANSLATIONS_COMPILE_QM ts_files out_qm_files) + find_package(Qt5LinguistTools) + foreach(TS_FILE ${ts_files}) + message("compile: ${TS_FILE}") + get_filename_component(TS_FILE_WE ${TS_FILE} NAME_WE) + set(QM_FILE_NAME "${TS_FILE_WE}.qm") + list(APPEND QM_FILES "${QM_FILE_NAME}") + execute_process(COMMAND lrelease -idbased "${TS_FILE}" -qm "${CMAKE_CURRENT_SOURCE_DIR}/${QM_FILE_NAME}") + message("compiled translation: ${CMAKE_CURRENT_SOURCE_DIR}/${QM_FILE_NAME}") + endforeach() + set(${out_qm_files} ${QM_FILES} PARENT_SCOPE) +endfunction() + if(LINUX) set (OUTPUT_NAME "BeamWallet${BEAM_SUFFIX_UPPER_CASE}") else() @@ -29,6 +53,9 @@ if(MSVC) endif() +list(APPEND SUPPORTED_LANGS "en_US") +list(APPEND SUPPORTED_LANGS "ru_RU") + set(UI_SRC ui.cpp viewmodel/start_view.h @@ -74,40 +101,18 @@ set(UI_SRC model/node_model.cpp ) -find_package(Qt5LinguistTools) -if (Qt5LinguistTools_FOUND) -##################### UPDATE TS - add_custom_target(UpdateTs ALL) - list(APPEND SUPPORTED_LANGS "en_US") - list(APPEND SUPPORTED_LANGS "ru_RU") - foreach(SUPPORTED_LANG ${SUPPORTED_LANGS}) - set(TS_FILE "${CMAKE_CURRENT_SOURCE_DIR}/i18n/${SUPPORTED_LANG}.ts") - list(APPEND TS_FILES "${TS_FILE}") - add_custom_command(TARGET UpdateTs - COMMAND lupdate -recursive -locations none ${CMAKE_CURRENT_SOURCE_DIR} -ts "${TS_FILE}") - endforeach() +beam_translations_update_ts("${SUPPORTED_LANGS}" TS_FILES) +beam_translations_compile_qm("${TS_FILES}" QM_FILES) + +set(TRANSLATIONS_QRC_FILE_NAME "translations.qrc") +set(TRANSLATIONS_QRC_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${TRANSLATIONS_QRC_FILE_NAME}") + +file(WRITE "${TRANSLATIONS_QRC_FILE}" "\n\t\n") +foreach (QM_FILE ${QM_FILES}) + file(APPEND "${TRANSLATIONS_QRC_FILE}" "\t\t${QM_FILE}\n") +endforeach () +file(APPEND "${TRANSLATIONS_QRC_FILE}" "\t\n") -################### CREQTE QM - add_custom_target(CreateQm ALL DEPENDS UpdateTs) - foreach(TS_FILE ${TS_FILES}) - get_filename_component(TS_FILE_WE ${TS_FILE} NAME_WE) - set(QM_FILE_NAME "${TS_FILE_WE}.qm") - list(APPEND QM_FILES "${QM_FILE_NAME}") - add_custom_command(TARGET CreateQm - COMMAND lrelease -idbased "${TS_FILE}" -qm "${CMAKE_CURRENT_BINARY_DIR}/${QM_FILE_NAME}" - BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/${QM_FILE_NAME}") - endforeach() - -############### translates QRC - set(TRANSLATIONS_QRC_FILE_NAME "translations.qrc") - set(TRANSLATIONS_QRC_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TRANSLATIONS_QRC_FILE_NAME}") - - file(WRITE "${TRANSLATIONS_QRC_FILE}" "") - foreach (QM_FILE ${QM_FILES}) - file(APPEND "${TRANSLATIONS_QRC_FILE}" "${QM_FILE}") - endforeach () - file(APPEND "${TRANSLATIONS_QRC_FILE}" "") -endif() find_package(Qt5QuickCompiler) if(Qt5QuickCompiler_FOUND) @@ -141,7 +146,7 @@ file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/beam_${BEAM_ICON_SUFFIX}.icns ${CMAKE_CU configure_file(${CMAKE_CURRENT_SOURCE_DIR}/beam.rc.in ${CMAKE_CURRENT_SOURCE_DIR}/beam.rc) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/beam.desktop.in ${CMAKE_CURRENT_SOURCE_DIR}/beam.desktop) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist) -add_executable(${TARGET_NAME} ${SYSTEM_TYPE} ${UI_SRC} ${QT_RESOURCES} beam.rc ${MACOSX_BUNDLE_ICON_FILE} ${QM_FILES}) +add_executable(${TARGET_NAME} ${SYSTEM_TYPE} ${UI_SRC} ${QT_RESOURCES} beam.rc ${MACOSX_BUNDLE_ICON_FILE}) set_target_properties(${TARGET_NAME} PROPERTIES OUTPUT_NAME ${OUTPUT_NAME}) configure_file("${PROJECT_SOURCE_DIR}/version.h.in" "${CMAKE_CURRENT_BINARY_DIR}/version.h") From c1c4451b51c42d90c79a5039431b393b7234f14f Mon Sep 17 00:00:00 2001 From: zavarza Date: Mon, 13 May 2019 12:29:32 +0300 Subject: [PATCH 070/136] #632 text updated --- ui/i18n/en_US.ts | 33 +++++++++++++++------------------ ui/i18n/ru_RU.ts | 35 ++++++++++++++++------------------- ui/model/wallet_model.cpp | 2 +- ui/view/start.qml | 2 +- ui/view/wallet.qml | 8 ++++++-- 5 files changed, 39 insertions(+), 41 deletions(-) diff --git a/ui/i18n/en_US.ts b/ui/i18n/en_US.ts index 9dbe58150..28b090cd6 100644 --- a/ui/i18n/en_US.ts +++ b/ui/i18n/en_US.ts @@ -407,17 +407,17 @@ Notifications view Notifications view - - updating - updating + + connecting + connecting online online - - connecting - connecting + + updating + updating General transaction info @@ -684,8 +684,8 @@ restore wallet - Your funds will be fully restored from the blockchain. The transaction history and your addresses are stored locally and are encrypted with your password, hence it can't be restored. - Your funds will be fully restored from the blockchain. The transaction history and your addresses are stored locally and are encrypted with your password, hence it can't be restored. + Your funds will be fully restored from the blockchain. The transaction history and addresses are stored only locally, hence can't be restored. + Your funds will be fully restored from the blockchain. The transaction history and addresses are stored only locally, hence can't be restored. That's the final version till the future validation and process. @@ -871,7 +871,7 @@ Node protocol error! Node protocol error! - + You are trying to connect to incompatible peer. You are trying to connect to incompatible peer. @@ -1179,16 +1179,13 @@ Failed to start the integrated node: the timezone settings of your machine are out of sync. Please fix them and restart the wallet. Failed to start the integrated node: the timezone settings of your machine are out of sync. Please fix them and restart the wallet. - - - wallet - - ok - ok - - + You cannot generate new address. Your wallet doesn't have a master key. - + You cannot generate new address. Your wallet doesn't have a master key. + + + ok + ok diff --git a/ui/i18n/ru_RU.ts b/ui/i18n/ru_RU.ts index a31b6112e..343598535 100644 --- a/ui/i18n/ru_RU.ts +++ b/ui/i18n/ru_RU.ts @@ -443,17 +443,17 @@ Notifications view ÐžÐ¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ - - updating - обновление + + connecting + подключение online в Ñети - - connecting - подключение + + updating + обновление General transaction info @@ -716,12 +716,12 @@ воÑÑтановить кошелек - Your funds will be fully restored from the blockchain. The transaction history and your addresses are stored locally and are encrypted with your password, hence it can't be restored. - Ваши ÑредÑтва будут воÑÑтановлены из цепочки блоков. ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð²Ð°ÑˆÐ¸Ñ… транзакций и ваши адреÑа хранÑÑ‚ÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾, зашифрованные паролем, их воÑÑтановление невожможно + Your funds will be fully restored from the blockchain. The transaction history and addresses are stored only locally, hence can't be restored. + Ваши ÑредÑтва будут воÑÑтановлены из цепочки блоков. ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð²Ð°ÑˆÐ¸Ñ… транзакций и ваши адреÑа хранÑÑ‚ÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾, поÑтому их воÑÑтановление невожможно. That's the final version till the future validation and process. - + Ð’Ñ‹ иÑпользуете поÑледнюю верÑию. create new wallet @@ -903,7 +903,7 @@ Node protocol error! Ошибка протокола - + You are trying to connect to incompatible peer. ÐеÑовмеÑтимый пир @@ -1179,16 +1179,13 @@ Failed to start the integrated node: the timezone settings of your machine are out of sync. Please fix them and restart the wallet. Ðевозможно запуÑтить локальный узел: Ð²Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° не Ñинхронизированно. Проверьте наÑтройки времени и перезапуÑтите кошелек. - - - wallet - - ok - ok - - + You cannot generate new address. Your wallet doesn't have a master key. - + Ð’Ñ‹ не можете Ñгенерировать новый адреÑ. Ð’ кошельке отÑутÑтвует маÑтер-ключ + + + ok + Хорошо diff --git a/ui/model/wallet_model.cpp b/ui/model/wallet_model.cpp index 6d600cc01..41a476f02 100644 --- a/ui/model/wallet_model.cpp +++ b/ui/model/wallet_model.cpp @@ -53,7 +53,7 @@ QString WalletModel::GetErrorString(beam::wallet::ErrorType type) return qtTrId("wallet-model-node-protocol-error"); case wallet::ErrorType::NodeProtocolIncompatible: //% "You are trying to connect to incompatible peer." - return qtTrId("wallet-model-incompatible-peer"); + return qtTrId("wallet-model-incompatible-peer-error"); case wallet::ErrorType::ConnectionBase: //% "Connection error." return qtTrId("wallet-model-connection-base-error"); diff --git a/ui/view/start.qml b/ui/view/start.qml index 1c48c2a22..b5638e8ac 100644 --- a/ui/view/start.qml +++ b/ui/view/start.qml @@ -39,7 +39,7 @@ Item SFText { horizontalAlignment : Text.AlignHCenter width: parent.width - //% "Your funds will be fully restored from the blockchain. The transaction history and your addresses are stored locally and are encrypted with your password, hence it can't be restored." + //% "Your funds will be fully restored from the blockchain. The transaction history and addresses are stored only locally, hence can't be restored." text: qsTrId("start-restore-message-line-1") color: Style.content_main font.pixelSize: 14 diff --git a/ui/view/wallet.qml b/ui/view/wallet.qml index 0e35651a2..a6438028f 100644 --- a/ui/view/wallet.qml +++ b/ui/view/wallet.qml @@ -100,7 +100,9 @@ Item { SFText { width: parent.width - text: qsTr("You cannot generate new address. Your wallet doesn't have a master key.") + // text: qsTr("You cannot generate new address. Your wallet doesn't have a master key.") + //% "You cannot generate new address. Your wallet doesn't have a master key." + text: qsTrId("can-not-generate-new-address-message") color: Style.content_main font.pixelSize: 14 font.styleName: "Bold"; font.weight: Font.Bold @@ -108,7 +110,9 @@ Item { } PrimaryButton { - text: qsTr("ok") + // text: qsTr("ok") + //% "ok" + text: qsTrId("can-not-generate-new-address-ok-button") anchors.horizontalCenter: parent.horizontalCenter icon.source: "qrc:/assets/icon-done.svg" onClicked: newAddressFailedDialog.close() From e7f472fa01d3d81987fce37da2d5564ecc0fd970 Mon Sep 17 00:00:00 2001 From: zavarza Date: Mon, 13 May 2019 12:36:13 +0300 Subject: [PATCH 071/136] #632 text updated --- ui/i18n/en_US.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/i18n/en_US.ts b/ui/i18n/en_US.ts index 28b090cd6..f60afd8fe 100644 --- a/ui/i18n/en_US.ts +++ b/ui/i18n/en_US.ts @@ -1173,7 +1173,7 @@ login to another wallet - + login to another wallet Failed to start the integrated node: the timezone settings of your machine are out of sync. Please fix them and restart the wallet. From 92e3cef4953822ee97739274d6aed01c123559b2 Mon Sep 17 00:00:00 2001 From: zavarza Date: Mon, 13 May 2019 13:14:54 +0300 Subject: [PATCH 072/136] #632 StatusBar.qml error message fix --- ui/view/controls/StatusBar.qml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ui/view/controls/StatusBar.qml b/ui/view/controls/StatusBar.qml index a58160ba7..4b725740a 100644 --- a/ui/view/controls/StatusBar.qml +++ b/ui/view/controls/StatusBar.qml @@ -10,17 +10,19 @@ Item { y: 53 property var model - - property string status: { + + function getStatus() { if (model.isFailedStatus) - "error" + return "error"; else if (model.isSyncInProgress) - "updating" + return "updating"; else if (model.isOnline) - "online" + return "online"; else - "connecting" + return "connecting"; } + + property string status: getStatus() state: "connecting" From 93c3f7c7ab8e8652b471debbff0299ac9fd519c7 Mon Sep 17 00:00:00 2001 From: Anatol Date: Thu, 23 May 2019 18:24:17 +0300 Subject: [PATCH 073/136] cold wallet hotfix, now cli cold wallet should stop after processing of all active transactions --- wallet/cli.cpp | 130 ++++++++++++++++--------------- wallet/common.h | 26 ++++++- wallet/unittests/wallet_test.cpp | 6 +- wallet/wallet.cpp | 32 +++++++- wallet/wallet.h | 8 +- wallet/wallet_network.cpp | 1 - wallet/wallet_transaction.cpp | 16 +++- wallet/wallet_transaction.h | 4 +- 8 files changed, 152 insertions(+), 71 deletions(-) diff --git a/wallet/cli.cpp b/wallet/cli.cpp index 53c6cdf49..c9fa24181 100644 --- a/wallet/cli.cpp +++ b/wallet/cli.cpp @@ -827,6 +827,14 @@ int main_impl(int argc, char* argv[]) LOG_INFO() << "Beam Wallet " << PROJECT_VERSION << " (" << BRANCH_NAME << ")"; LOG_INFO() << "Rules signature: " << Rules::get().Checksum; + bool coldWallet = vm.count(cli::COLD_WALLET) > 0; + + if (coldWallet && command == cli::RESTORE) + { + LOG_ERROR() << "You can't restore cold wallet."; + return -1; + } + assert(vm.count(cli::WALLET_STORAGE) > 0); auto walletPath = vm[cli::WALLET_STORAGE].as(); @@ -859,8 +867,6 @@ int main_impl(int argc, char* argv[]) } } - bool coldWallet = vm.count(cli::COLD_WALLET) > 0; - if (command == cli::INIT || command == cli::RESTORE) { NoLeak walletSeed; @@ -937,7 +943,7 @@ int main_impl(int argc, char* argv[]) auto comment = vm[cli::NEW_ADDRESS_COMMENT].as(); newAddress(walletDB, comment, vm[cli::EXPIRATION_TIME].as() == "never"); - if (!vm.count(cli::LISTEN)) + if (!vm.count(cli::LISTEN)) { return 0; } @@ -1011,86 +1017,88 @@ int main_impl(int argc, char* argv[]) bool is_server = (command == cli::LISTEN || vm.count(cli::LISTEN)); - Wallet wallet{ walletDB, is_server ? Wallet::TxCompletedAction() : [](auto) { io::Reactor::get_Current().stop(); } }; - - if (!coldWallet) + Wallet wallet{ walletDB, is_server ? Wallet::TxCompletedAction() : [](auto) { io::Reactor::get_Current().stop(); }, + !coldWallet ? Wallet::UpdateCompletedAction() : []() {io::Reactor::get_Current().stop(); } }; { - if (vm.count(cli::NODE_ADDR) == 0) + wallet::AsyncContextHolder holder(wallet); + if (!coldWallet) { - LOG_ERROR() << "node address should be specified"; - return -1; - } + if (vm.count(cli::NODE_ADDR) == 0) + { + LOG_ERROR() << "node address should be specified"; + return -1; + } - string nodeURI = vm[cli::NODE_ADDR].as(); - io::Address nodeAddress; - if (!nodeAddress.resolve(nodeURI.c_str())) + string nodeURI = vm[cli::NODE_ADDR].as(); + io::Address nodeAddress; + if (!nodeAddress.resolve(nodeURI.c_str())) + { + LOG_ERROR() << "unable to resolve node address: " << nodeURI; + return -1; + } + + auto nnet = make_shared(wallet); + nnet->m_Cfg.m_vNodes.push_back(nodeAddress); + nnet->Connect(); + wallet.AddMessageEndpoint(make_shared(wallet, nnet, walletDB)); + wallet.SetNodeEndpoint(nnet); + } + else { - LOG_ERROR() << "unable to resolve node address: " << nodeURI; - return -1; + wallet.AddMessageEndpoint(make_shared(wallet, walletDB)); } - auto nnet = make_shared(wallet); - nnet->m_Cfg.m_vNodes.push_back(nodeAddress); - nnet->Connect(); - wallet.AddMessageEndpoint(make_shared(wallet, nnet, walletDB)); - wallet.SetNodeEndpoint(nnet); - } - else - { - wallet.AddMessageEndpoint(make_shared(wallet, walletDB)); - } - - if (isTxInitiator) - { - WalletAddress senderAddress = newAddress(walletDB, ""); - CoinIDList coinIDs = GetPreselectedCoinIDs(vm); - wallet.transfer_money(senderAddress.m_walletID, receiverWalletID, move(amount), move(fee), coinIDs, command == cli::SEND, 120, 720, {}, true); - } - - bool deleteTx = command == cli::DELETE_TX; - if (command == cli::CANCEL_TX || deleteTx) - { - auto txIdVec = from_hex(vm[cli::TX_ID].as()); - TxID txId; - std::copy_n(txIdVec.begin(), 16, txId.begin()); - auto tx = walletDB->getTx(txId); + if (isTxInitiator) + { + WalletAddress senderAddress = newAddress(walletDB, ""); + CoinIDList coinIDs = GetPreselectedCoinIDs(vm); + wallet.transfer_money(senderAddress.m_walletID, receiverWalletID, move(amount), move(fee), coinIDs, command == cli::SEND, 120, 720, {}, true); + } - if (tx) + bool deleteTx = command == cli::DELETE_TX; + if (command == cli::CANCEL_TX || deleteTx) { - if (deleteTx) + auto txIdVec = from_hex(vm[cli::TX_ID].as()); + TxID txId; + std::copy_n(txIdVec.begin(), 16, txId.begin()); + auto tx = walletDB->getTx(txId); + + if (tx) { - if (tx->canDelete()) + if (deleteTx) { - wallet.delete_tx(txId); + if (tx->canDelete()) + { + wallet.delete_tx(txId); + } + else + { + LOG_ERROR() << "Transaction could not be deleted. Invalid transaction status."; + } } else { - LOG_ERROR() << "Transaction could not be deleted. Invalid transaction status."; + if (tx->canCancel()) + { + wallet.cancel_tx(txId); + } + else + { + LOG_ERROR() << "Transaction could not be cancelled. Invalid transaction status."; + } } } else { - if (tx->canCancel()) - { - wallet.cancel_tx(txId); - } - else - { - LOG_ERROR() << "Transaction could not be cancelled. Invalid transaction status."; - } + LOG_ERROR() << "Unknown transaction ID."; } } - else + + if (command == cli::WALLET_RESCAN) { - LOG_ERROR() << "Unknown transaction ID."; + wallet.Refresh(); } } - - if (command == cli::WALLET_RESCAN) - { - wallet.Refresh(); - } - io::Reactor::get_Current().run(); } } diff --git a/wallet/common.h b/wallet/common.h index bb4f836c8..4c8996a1e 100644 --- a/wallet/common.h +++ b/wallet/common.h @@ -359,10 +359,32 @@ namespace beam } SERIALIZE(m_From, m_TxID, m_Type, m_Parameters); - static const size_t MaxParams = 20; }; - struct INegotiatorGateway + // Ñontext to take into account all async wallet operations + struct IAsyncContext + { + virtual void OnAsyncStarted() = 0; + virtual void OnAsyncFinished() = 0; + }; + + class AsyncContextHolder + { + public: + AsyncContextHolder(IAsyncContext& context) + : m_Context(context) + { + m_Context.OnAsyncStarted(); + } + ~AsyncContextHolder() + { + m_Context.OnAsyncFinished(); + } + private: + IAsyncContext& m_Context; + }; + + struct INegotiatorGateway : IAsyncContext { virtual ~INegotiatorGateway() {} virtual void on_tx_completed(const TxID& ) = 0; diff --git a/wallet/unittests/wallet_test.cpp b/wallet/unittests/wallet_test.cpp index e752ab736..28c4378b9 100644 --- a/wallet/unittests/wallet_test.cpp +++ b/wallet/unittests/wallet_test.cpp @@ -354,7 +354,7 @@ namespace { TestWalletRig(const string& name, IWalletDB::Ptr walletDB, Wallet::TxCompletedAction&& action = Wallet::TxCompletedAction(), bool coldWallet = false, bool oneTimeBbsEndpoint = false) : m_WalletDB{walletDB} - , m_Wallet{ m_WalletDB, move(action) } + , m_Wallet{ m_WalletDB, move(action), coldWallet ? []() {io::Reactor::get_Current().stop(); } : Wallet::UpdateCompletedAction() } { if (m_WalletDB->get_MasterKdf()) // can create secrets { @@ -1682,6 +1682,8 @@ namespace io::Reactor::Scope scope(*mainReactor); struct TestGateway : wallet::INegotiatorGateway { + void OnAsyncStarted() override {} + void OnAsyncFinished() override {} void on_tx_completed(const TxID&) override {} void register_tx(const TxID&, Transaction::Ptr) override {} void confirm_outputs(const std::vector&) override {} @@ -1915,7 +1917,7 @@ namespace boost::filesystem::copy_file(publicPath, SenderWalletDB); auto privateDB = WalletDB::open(SenderWalletDB, DBPassword, io::Reactor::get_Current().shared_from_this()); TestWalletRig privateSender("sender", privateDB, f, true); - //mainReactor->run(); // no need in run() + mainReactor->run(); } // cold -> hot diff --git a/wallet/wallet.cpp b/wallet/wallet.cpp index ebd913fe3..750d7c92f 100644 --- a/wallet/wallet.cpp +++ b/wallet/wallet.cpp @@ -92,9 +92,10 @@ namespace beam const char Wallet::s_szNextUtxoEvt[] = "NextUtxoEvent"; - Wallet::Wallet(IWalletDB::Ptr walletDB, TxCompletedAction&& action) + Wallet::Wallet(IWalletDB::Ptr walletDB, TxCompletedAction&& action, UpdateCompletedAction&& updateCompleted) : m_WalletDB{ walletDB } , m_TxCompletedAction{move(action)} + , m_UpdateCompleted{move(updateCompleted)} , m_LastSyncTotal(0) , m_OwnedNodesOnline(0) { @@ -279,6 +280,7 @@ namespace beam } } auto t = m_Transactions; + AsyncContextHolder holder(*this); for (auto& p : t) { auto tx = p.second; @@ -306,6 +308,27 @@ namespace beam } } + void Wallet::OnAsyncStarted() + { + if (m_AsyncUpdateCounter == 0) + { + LOG_DEBUG() << "Async update started!"; + } + ++m_AsyncUpdateCounter; + } + + void Wallet::OnAsyncFinished() + { + if (--m_AsyncUpdateCounter == 0) + { + LOG_DEBUG() << "Async update finished!"; + if (m_UpdateCompleted) + { + m_UpdateCompleted(); + } + } + } + void Wallet::on_tx_completed(const TxID& txID) { // Note: the passed TxID is (most probably) the member of the transaction, which we, most probably, are going to erase from the map, which can potentially delete it. @@ -486,9 +509,14 @@ namespace beam bool bSynced = !SyncRemains() && IsNodeInSync(); if (bSynced) + { + AsyncContextHolder holder(*this); tx->Update(); + } else + { UpdateOnSynced(tx); + } } else { @@ -536,6 +564,7 @@ namespace beam if (tx->SetParameter(TxParameterID::KernelProofHeight, r.m_Res.m_Proof.m_State.m_Height)) { + AsyncContextHolder holder(*this); tx->Update(); } } @@ -785,6 +814,7 @@ namespace beam std::unordered_set txSet; txSet.swap(m_TransactionsToUpdate); + AsyncContextHolder async(*this); for (auto it = txSet.begin(); txSet.end() != it; it++) { wallet::BaseTransaction::Ptr pTx = *it; diff --git a/wallet/wallet.h b/wallet/wallet.h index bf900d27c..c5f802d32 100644 --- a/wallet/wallet.h +++ b/wallet/wallet.h @@ -68,8 +68,9 @@ namespace beam using Callback = std::function; public: using TxCompletedAction = std::function; + using UpdateCompletedAction = std::function; - Wallet(IWalletDB::Ptr walletDB, TxCompletedAction&& action = TxCompletedAction()); + Wallet(IWalletDB::Ptr walletDB, TxCompletedAction&& action = TxCompletedAction(), UpdateCompletedAction&& updateCompleted = UpdateCompletedAction()); virtual ~Wallet(); void SetNodeEndpoint(std::shared_ptr nodeEndpoint); @@ -92,6 +93,9 @@ namespace beam void RefreshTransactions(); void ResumeTransaction(const TxDescription& tx); void ResumeAllTransactions(); + + void OnAsyncStarted() override; + void OnAsyncFinished() override; void on_tx_completed(const TxID& txID) override; void confirm_outputs(const std::vector&) override; @@ -213,10 +217,12 @@ namespace beam std::unordered_set m_TransactionsToUpdate; std::unordered_set m_NextTipTransactionToUpdate; TxCompletedAction m_TxCompletedAction; + UpdateCompletedAction m_UpdateCompleted; uint32_t m_LastSyncTotal; uint32_t m_OwnedNodesOnline; std::vector m_subscribers; std::set m_MessageEndpoints; + int m_AsyncUpdateCounter = 0; }; } diff --git a/wallet/wallet_network.cpp b/wallet/wallet_network.cpp index 79572562c..5cbbc3d99 100644 --- a/wallet/wallet_network.cpp +++ b/wallet/wallet_network.cpp @@ -588,6 +588,5 @@ namespace beam { void ColdWalletMessageEndpoint::SendEncryptedMessage(const WalletID& peerID, const ByteBuffer& msg) { m_WalletDB->saveWalletMessage(WalletMessage{ 0, peerID, msg }); - io::Reactor::get_Current().stop(); } } diff --git a/wallet/wallet_transaction.cpp b/wallet/wallet_transaction.cpp index 6f6d9e9b7..110c77032 100644 --- a/wallet/wallet_transaction.cpp +++ b/wallet/wallet_transaction.cpp @@ -107,6 +107,7 @@ namespace beam { namespace wallet void BaseTransaction::Update() { + AsyncContextHolder async(m_Gateway); try { if (CheckExternalFailures()) @@ -133,9 +134,20 @@ namespace beam { namespace wallet { TxStatus s = TxStatus::Failed; GetParameter(TxParameterID::Status, s); + // TODO: add CanCancel() method if (s == TxStatus::Pending || s == TxStatus::InProgress) { - NotifyFailure(TxFailureReason::Cancelled); + if (s == TxStatus::InProgress) + { + if (!m_WalletDB->get_MasterKdf()) + { + // cannot create encrypted message + return; + } + // notify about cancellation if we have started negotiations + NotifyFailure(TxFailureReason::Cancelled); + + } UpdateTxDescription(TxStatus::Cancelled); RollbackTx(); m_Gateway.on_tx_completed(GetTxID()); @@ -375,6 +387,7 @@ namespace beam { namespace wallet if (!builder.GetCoins().empty()) { + m_Gateway.OnAsyncStarted(); m_CompletedEvent = io::AsyncEvent::create(io::Reactor::get_Current(), [this, sharedBuilder]() mutable { if (!sharedBuilder->FinalizeOutputs()) @@ -382,6 +395,7 @@ namespace beam { namespace wallet //TODO: transaction is too big :( } Update(); + m_Gateway.OnAsyncFinished(); }); m_OutputsFuture = async(launch::async, [this, sharedBuilder]() mutable { diff --git a/wallet/wallet_transaction.h b/wallet/wallet_transaction.h index 84a491486..133e3f8e6 100644 --- a/wallet/wallet_transaction.h +++ b/wallet/wallet_transaction.h @@ -66,7 +66,7 @@ namespace beam { namespace wallet void Update() override; void Cancel() override; - static const uint32_t s_ProtoVersion; + static const uint32_t s_ProtoVersion; template bool GetParameter(TxParameterID paramID, T& value) const @@ -107,7 +107,7 @@ namespace beam { namespace wallet IWalletDB::Ptr GetWalletDB(); bool IsInitiator() const; - uint32_t get_PeerVersion() const; + uint32_t get_PeerVersion() const; bool GetTip(Block::SystemState::Full& state) const; protected: bool CheckExpired(); From 09ed8acbfc2298b52acdbb80c9ecd6f1f1e2163a Mon Sep 17 00:00:00 2001 From: Webonnix <32932298+Webonnix@users.noreply.github.com> Date: Mon, 10 Jun 2019 12:52:58 +0300 Subject: [PATCH 074/136] Dockerfile Dockerfile for testnet --- Dockerfile | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..9f9a82834 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +FROM ubuntu:19.10 + +# Define arguments +ARG beam=beam-node-testnet.tar.gz + +# Install. +RUN \ + apt-get -y update && \ + mkdir -p /home/beam/node/ && \ + apt -y install wget && \ + wget -P /home/beam/node/ https://builds.beam.mw/testnet/latest/Release/linux/$beam && \ + cd /home/beam/node/ && tar -xvf $beam && rm -rf $beam + +# Define volume & working directory. +WORKDIR /home/beam/node/ +VOLUME /home/beam/node/ + +# Define default command. +EXPOSE 8100 +CMD ["/home/beam/node/beam-node-testnet", "--peer=ap-nodes.testnet.beam.mw:8100,eu-nodes.testnet.beam.mw:8100,us-nodes.testnet.beam.mw:8100"] From 98c9cdb342bf15b17a8a52b643cc52272640c94f Mon Sep 17 00:00:00 2001 From: zavarza Date: Wed, 12 Jun 2019 17:09:05 +0300 Subject: [PATCH 075/136] Dockerfile fixed --- .dockerignore | 1 + Dockerfile | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..72e8ffc0d --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +* diff --git a/Dockerfile b/Dockerfile index 9f9a82834..3e521f335 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:19.10 +FROM ubuntu:18.04 # Define arguments ARG beam=beam-node-testnet.tar.gz @@ -7,14 +7,17 @@ ARG beam=beam-node-testnet.tar.gz RUN \ apt-get -y update && \ mkdir -p /home/beam/node/ && \ - apt -y install wget && \ + apt-get -y install wget && \ wget -P /home/beam/node/ https://builds.beam.mw/testnet/latest/Release/linux/$beam && \ - cd /home/beam/node/ && tar -xvf $beam && rm -rf $beam + cd /home/beam/node/ && tar -xvf $beam && rm -rf $beam && \ + apt-get purge wget -y && \ + apt-get autoremove -y && \ + rm -rf /var/lib/apt/lists/* # Define volume & working directory. WORKDIR /home/beam/node/ VOLUME /home/beam/node/ # Define default command. -EXPOSE 8100 -CMD ["/home/beam/node/beam-node-testnet", "--peer=ap-nodes.testnet.beam.mw:8100,eu-nodes.testnet.beam.mw:8100,us-nodes.testnet.beam.mw:8100"] +EXPOSE 10000 +CMD ["./beam-node-testnet", "--peer=ap-nodes.testnet.beam.mw:8100,eu-nodes.testnet.beam.mw:8100,us-nodes.testnet.beam.mw:8100"] From 9c4fbd00ec6335d6e63c11ef4ab97e924f6e7795 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Thu, 6 Jun 2019 12:06:17 +0300 Subject: [PATCH 076/136] android #225: export owner key --- .../beam/beamwallet/core/entities/Wallet.java | 1 + android/jni.cpp | 7 +++++++ wallet/wallet_client.cpp | 17 +++++++++++++++++ wallet/wallet_client.h | 1 + 4 files changed, 26 insertions(+) diff --git a/android/com/mw/beam/beamwallet/core/entities/Wallet.java b/android/com/mw/beam/beamwallet/core/entities/Wallet.java index 60239e235..708e380e3 100644 --- a/android/com/mw/beam/beamwallet/core/entities/Wallet.java +++ b/android/com/mw/beam/beamwallet/core/entities/Wallet.java @@ -41,6 +41,7 @@ public class Wallet public native PaymentInfoDTO verifyPaymentInfo(String paymentInfo); public native void getCoinsByTx(String txID); public native void changeNodeAddress(String address); + public native String exportOwnerKey(String pass); // not implemented public native void changeCurrentWalletIDs(); //const beam::WalletID& senderID, const beam::WalletID& receiverID); diff --git a/android/jni.cpp b/android/jni.cpp index 60ae6165c..45611e2f2 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -491,6 +491,13 @@ JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(changeNodeAddress)(JNIEnv *env walletModel->getAsync()->setNodeAddress(addr); } +JNIEXPORT jstring JNICALL BEAM_JAVA_WALLET_INTERFACE(exportOwnerKey)(JNIEnv *env, jobject thiz, + jstring pass) +{ + std::string ownerKey = walletModel->exportOwnerKey(JString(env, pass).value()); + return env->NewStringUTF(ownerKey.c_str()); +} + JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv *env; diff --git a/wallet/wallet_client.cpp b/wallet/wallet_client.cpp index 478cc54f5..5e6cb9db0 100644 --- a/wallet/wallet_client.cpp +++ b/wallet/wallet_client.cpp @@ -375,6 +375,23 @@ std::string WalletClient::getNodeAddress() const return m_nodeAddrStr; } +std::string WalletClient::exportOwnerKey(const beam::SecString& pass) const +{ + Key::IKdf::Ptr pKey = m_walletDB->get_ChildKdf(0); + const ECC::HKdf& kdf = static_cast(*pKey); + + KeyString ks; + ks.SetPassword(Blob(pass.data(), static_cast(pass.size()))); + ks.m_sMeta = std::to_string(0); + + ECC::HKdfPub pkdf; + pkdf.GenerateFrom(kdf); + + ks.Export(pkdf); + + return ks.m_sRes; +} + bool WalletClient::isRunning() const { return m_isRunning; diff --git a/wallet/wallet_client.h b/wallet/wallet_client.h index 25e1e26ab..2a46b0132 100644 --- a/wallet/wallet_client.h +++ b/wallet/wallet_client.h @@ -52,6 +52,7 @@ class WalletClient IWalletModelAsync::Ptr getAsync(); std::string getNodeAddress() const; + std::string exportOwnerKey(const beam::SecString& pass) const; bool isRunning() const; protected: From 6aa96f87d471367f1a1b7fa0e6ce02152eea60d8 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Thu, 6 Jun 2019 13:25:01 +0300 Subject: [PATCH 077/136] android: added new parameter to sendMoney from jni --- android/WalletJNI.java | 2 +- .../beam/beamwallet/core/entities/Wallet.java | 2 +- android/jni.cpp | 32 +++++++++++++------ wallet/wallet_client.cpp | 8 +++++ wallet/wallet_client.h | 1 + wallet/wallet_model_async.h | 1 + 6 files changed, 35 insertions(+), 11 deletions(-) diff --git a/android/WalletJNI.java b/android/WalletJNI.java index 501e077c7..3c6c8c5b4 100644 --- a/android/WalletJNI.java +++ b/android/WalletJNI.java @@ -85,7 +85,7 @@ public static void main(String[] args) { sendAttempt = true; - wallet.sendMoney("fbac2507faf499581aff0a2b97bccf5e4705aa36714ca14a529e98e8c4641ab7", "test comment", 1500, 10); + wallet.sendMoney("", "fbac2507faf499581aff0a2b97bccf5e4705aa36714ca14a529e98e8c4641ab7", "test comment", 1500, 10); } } try diff --git a/android/com/mw/beam/beamwallet/core/entities/Wallet.java b/android/com/mw/beam/beamwallet/core/entities/Wallet.java index 708e380e3..fdf27ac12 100644 --- a/android/com/mw/beam/beamwallet/core/entities/Wallet.java +++ b/android/com/mw/beam/beamwallet/core/entities/Wallet.java @@ -26,7 +26,7 @@ public class Wallet public native void getWalletStatus(); public native void getUtxosStatus(); public native void syncWithNode(); - public native void sendMoney(String receiver, String comment, long amount, long fee); + public native void sendMoney(String sender, String receiver, String comment, long amount, long fee); public native void calcChange(long amount); public native void getAddresses(boolean own); public native void generateNewAddress(); diff --git a/android/jni.cpp b/android/jni.cpp index 45611e2f2..a58276478 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -308,18 +308,32 @@ JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(syncWithNode)(JNIEnv *env, job } JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(sendMoney)(JNIEnv *env, jobject thiz, - jstring receiverAddr, jstring comment, jlong amount, jlong fee) + jstring senderAddr, jstring receiverAddr, jstring comment, jlong amount, jlong fee) { - LOG_DEBUG() << "sendMoney(" << JString(env, receiverAddr).value() << ", " << JString(env, comment).value() << ", " << amount << ", " << fee << ")"; + LOG_DEBUG() << "sendMoney(" << JString(env, senderAddr).value() << ", " << JString(env, receiverAddr).value() << ", " << JString(env, comment).value() << ", " << amount << ", " << fee << ")"; - WalletID walletID(Zero); - walletID.FromHex(JString(env, receiverAddr).value()); + WalletID receiverID(Zero); + receiverID.FromHex(JString(env, receiverAddr).value()); + + auto sender = JString(env, senderAddr).value(); - // TODO: show 'operation in process' animation here? - walletModel->getAsync()->sendMoney(walletID - , JString(env, comment).value() - , beam::Amount(amount) - , beam::Amount(fee)); + if (sender.empty()) + { + walletModel->getAsync()->sendMoney(receiverID + , JString(env, comment).value() + , beam::Amount(amount) + , beam::Amount(fee)); + } + else + { + WalletID senderID(Zero); + senderID.FromHex(sender); + + walletModel->getAsync()->sendMoney(senderID, receiverID + , JString(env, comment).value() + , beam::Amount(amount) + , beam::Amount(fee)); + } } JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(calcChange)(JNIEnv *env, jobject thiz, diff --git a/wallet/wallet_client.cpp b/wallet/wallet_client.cpp index 5e6cb9db0..7626e0078 100644 --- a/wallet/wallet_client.cpp +++ b/wallet/wallet_client.cpp @@ -55,6 +55,14 @@ struct WalletModelBridge : public Bridge }); } + void sendMoney(const beam::WalletID& senderID, const beam::WalletID& receiverID, const std::string& comment, beam::Amount&& amount, beam::Amount&& fee) override + { + tx.send([senderID, receiverID, comment, amount{ move(amount) }, fee{ move(fee) }](BridgeInterface& receiver_) mutable + { + receiver_.sendMoney(senderID, receiverID, comment, move(amount), move(fee)); + }); + } + void syncWithNode() override { tx.send([](BridgeInterface& receiver_) mutable diff --git a/wallet/wallet_client.h b/wallet/wallet_client.h index 2a46b0132..18ea14052 100644 --- a/wallet/wallet_client.h +++ b/wallet/wallet_client.h @@ -84,6 +84,7 @@ class WalletClient void onSyncProgress(int done, int total) override; void sendMoney(const beam::WalletID& receiver, const std::string& comment, beam::Amount&& amount, beam::Amount&& fee) override; + void sendMoney(const beam::WalletID& sender, const beam::WalletID& receiver, const std::string& comment, beam::Amount&& amount, beam::Amount&& fee) override; void syncWithNode() override; void calcChange(beam::Amount&& amount) override; void getWalletStatus() override; diff --git a/wallet/wallet_model_async.h b/wallet/wallet_model_async.h index 6dda79ce9..b612ba65a 100644 --- a/wallet/wallet_model_async.h +++ b/wallet/wallet_model_async.h @@ -23,6 +23,7 @@ struct IWalletModelAsync using Ptr = std::shared_ptr; virtual void sendMoney(const beam::WalletID& receiver, const std::string& comment, beam::Amount&& amount, beam::Amount&& fee = 0) = 0; + virtual void sendMoney(const beam::WalletID& sender, const beam::WalletID& receiver, const std::string& comment, beam::Amount&& amount, beam::Amount&& fee = 0) = 0; virtual void syncWithNode() = 0; virtual void calcChange(beam::Amount&& amount) = 0; virtual void getWalletStatus() = 0; From 97fc37d0878db0702fa9108ed559a8a96d92a0c1 Mon Sep 17 00:00:00 2001 From: Anatol Date: Thu, 13 Jun 2019 13:13:56 +0300 Subject: [PATCH 078/136] fixed build --- mnemonic/CMakeLists.txt | 3 +++ wallet/wallet_client.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/mnemonic/CMakeLists.txt b/mnemonic/CMakeLists.txt index 7469491d8..f82a64da7 100644 --- a/mnemonic/CMakeLists.txt +++ b/mnemonic/CMakeLists.txt @@ -10,6 +10,9 @@ set(MNEMONIC_SRC ${PROJECT_SOURCE_DIR}/3rdparty/zeroize.c ) +if (MSVC AND (MSVC_VERSION GREATER_EQUAL 1921)) + add_compile_options("/bigobj") +endif() add_library(${TARGET_NAME} STATIC ${MNEMONIC_SRC}) target_include_directories(${TARGET_NAME} PRIVATE ${PROJECT_SOURCE_DIR}}/external) add_dependencies(${TARGET_NAME} core) diff --git a/wallet/wallet_client.cpp b/wallet/wallet_client.cpp index 7626e0078..9c74d57e2 100644 --- a/wallet/wallet_client.cpp +++ b/wallet/wallet_client.cpp @@ -473,6 +473,40 @@ void WalletClient::sendMoney(const beam::WalletID& receiver, const std::string& } } +void WalletClient::sendMoney(const WalletID& sender, const WalletID& receiver, const std::string& comment, Amount&& amount, Amount&& fee) +{ + try + { + ByteBuffer message(comment.begin(), comment.end()); + + assert(!m_wallet.expired()); + auto s = m_wallet.lock(); + if (s) + { + s->transfer_money(sender, receiver, move(amount), move(fee), true, 120, 720, move(message), true); + } + + onSendMoneyVerified(); + } + catch (const CannotGenerateSecretException&) + { + onNewAddressFailed(); + return; + } + catch (const AddressExpiredException&) + { + onCantSendToExpired(); + return; + } + catch (const std::exception& e) + { + LOG_UNHANDLED_EXCEPTION() << "what = " << e.what(); + } + catch (...) { + LOG_UNHANDLED_EXCEPTION(); + } +} + void WalletClient::syncWithNode() { assert(!m_nodeNetwork.expired()); From bdae6f63be5e2f63bb80ac3e121eb10af1354a37 Mon Sep 17 00:00:00 2001 From: Anatol Date: Mon, 15 Jul 2019 14:31:41 +0300 Subject: [PATCH 079/136] commited testnet height --- core/block_crypt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/block_crypt.cpp b/core/block_crypt.cpp index d144b2867..fae7d33ae 100644 --- a/core/block_crypt.cpp +++ b/core/block_crypt.cpp @@ -973,7 +973,7 @@ namespace beam ZeroObject(pForks); - pForks[1].m_Height = MaxHeight; // not decided yet + pForks[1].m_Height = 270910; // testnet fork // future forks for (size_t i = 2; i < _countof(pForks); i++) From 43a7bcc22689bc0f41c891882060163bb360afe3 Mon Sep 17 00:00:00 2001 From: Anatol Date: Tue, 23 Jul 2019 17:23:42 +0300 Subject: [PATCH 080/136] #783 fixed transaction on rollback --- wallet/unittests/wallet_test.cpp | 32 ++++++++++++++++++++++++++++++++ wallet/wallet.cpp | 20 ++++++++++++++++++-- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/wallet/unittests/wallet_test.cpp b/wallet/unittests/wallet_test.cpp index c627fb218..48975b8d0 100644 --- a/wallet/unittests/wallet_test.cpp +++ b/wallet/unittests/wallet_test.cpp @@ -252,6 +252,38 @@ namespace WALLET_CHECK(stx->m_sender == true); WALLET_CHECK(rtx->m_sender == false); + // rollback test + { + + Block::SystemState::Full sTip; + receiver.m_WalletDB->get_History().get_Tip(sTip); + + receiver.m_WalletDB->get_History().DeleteFrom(sTip.m_Height); // delete latest block + + proto::FlyClient& flyClient = receiver.m_Wallet; + //imitate rollback + flyClient.OnRolledBack(); + receiver.m_WalletDB->get_History().AddStates(&sTip, 1); + flyClient.OnNewTip(); + completedCount = 1; // sender's transaction is completed + mainReactor->run(); + + newReceiverCoins = receiver.GetCoins(); + + WALLET_CHECK(newReceiverCoins[0].m_ID.m_Value == 4); + WALLET_CHECK(newReceiverCoins[0].m_status == Coin::Available); + WALLET_CHECK(newReceiverCoins[0].m_ID.m_Type == Key::Type::Regular); + + // Tx history check + rh = receiver.m_WalletDB->getTxHistory(); + WALLET_CHECK(rh.size() == 1); + rtx = receiver.m_WalletDB->getTx(txId); + WALLET_CHECK(rtx.is_initialized()); + + WALLET_CHECK(rtx->m_status == TxStatus::Completed); + WALLET_CHECK(rtx->m_sender == false); + } + // second transfer auto preselectedCoins = sender.m_WalletDB->selectCoins(6); CoinIDList preselectedIDs; diff --git a/wallet/wallet.cpp b/wallet/wallet.cpp index 66351987d..4bfce4c0b 100644 --- a/wallet/wallet.cpp +++ b/wallet/wallet.cpp @@ -923,8 +923,7 @@ namespace beam::wallet m_WalletDB->rollbackConfirmedUtxo(sTip.m_Height); - ResumeAllTransactions(); - + // Rollback active transaction for (auto it = m_ActiveTransactions.begin(); m_ActiveTransactions.end() != it; it++) { const auto& pTx = it->second; @@ -935,6 +934,23 @@ namespace beam::wallet } } + // Rollback inactive (completed or active) transactions if applicable + auto txs = m_WalletDB->getTxHistory(TxType::ALL); // get list of ALL transactions + for (auto& tx : txs) + { + // For all transactions that are not currently in the 'active' tx list + if (m_ActiveTransactions.find(tx.m_txId) == m_ActiveTransactions.end()) + { + // Reconstruct tx with reset parameters and add it to the active list + auto pTx = constructTransaction(tx.m_txId, tx.m_txType); + if (pTx->Rollback(sTip.m_Height)) + { + m_ActiveTransactions.emplace(tx.m_txId, pTx); + UpdateOnSynced(pTx); + } + } + } + Height h = GetUtxoEventsHeightNext(); if (h > sTip.m_Height + 1) SetUtxoEventsHeight(sTip.m_Height); From b75aedead5ad608213d29f22416373b7ff7cc7b4 Mon Sep 17 00:00:00 2001 From: Denis Homutovski Date: Mon, 8 Jul 2019 16:36:50 +0300 Subject: [PATCH 081/136] #246 Address name field usage changes # Conflicts: # CMakeLists.txt --- CMakeLists.txt | 1 + android/CMakeLists.txt | 2 ++ wallet/cli.cpp | 8 ++++---- wallet/wallet.cpp | 10 ---------- wallet/wallet_client.cpp | 10 ++-------- wallet/wallet_db.h | 2 +- 6 files changed, 10 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 25be62d4c..caac68e15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ cmake_minimum_required(VERSION 3.5) +cmake_policy(SET CMP0074 NEW) set(VERSION_MAJOR 3) set(VERSION_MINOR 0) diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index 5de8a961b..153eb45be 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -1,3 +1,5 @@ +cmake_minimum_required(VERSION 3.1) + set(TARGET_NAME wallet-jni) set(SRC diff --git a/wallet/cli.cpp b/wallet/cli.cpp index 6f8ba0608..5b25ef26f 100644 --- a/wallet/cli.cpp +++ b/wallet/cli.cpp @@ -481,7 +481,7 @@ namespace return -1; } - WalletAddress CreateNewAddress(const IWalletDB::Ptr& walletDB, const std::string& comment, bool isNever = false) + WalletAddress CreateNewAddress(const IWalletDB::Ptr& walletDB, const std::string& label, bool isNever = false) { WalletAddress address = storage::createAddress(*walletDB); @@ -490,12 +490,12 @@ namespace address.m_duration = 0; } - address.m_label = comment; + address.m_label = label; walletDB->saveAddress(address); LOG_INFO() << "New address generated:\n\n" << std::to_string(address.m_walletID) << "\n"; - if (!comment.empty()) { - LOG_INFO() << "comment = " << comment; + if (!label.empty()) { + LOG_INFO() << "label = " << label; } return address; } diff --git a/wallet/wallet.cpp b/wallet/wallet.cpp index 4bfce4c0b..e13e33333 100644 --- a/wallet/wallet.cpp +++ b/wallet/wallet.cpp @@ -217,22 +217,12 @@ namespace beam::wallet LOG_INFO() << "Can't send to the expired address."; throw AddressExpiredException(); } - - // update address comment if changed - auto messageStr = std::string(message.begin(), message.end()); - - if (messageStr != receiverAddr->m_label) - { - receiverAddr->m_label = messageStr; - m_WalletDB->saveAddress(*receiverAddr); - } } else if (saveReceiver) { WalletAddress address; address.m_walletID = to; address.m_createTime = getTimestamp(); - address.m_label = std::string(message.begin(), message.end()); m_WalletDB->saveAddress(address); } diff --git a/wallet/wallet_client.cpp b/wallet/wallet_client.cpp index c03a7e412..e3b723dce 100644 --- a/wallet/wallet_client.cpp +++ b/wallet/wallet_client.cpp @@ -445,7 +445,6 @@ namespace beam::wallet try { WalletAddress senderAddress = storage::createAddress(*m_walletDB); - senderAddress.m_label = comment; saveAddress(senderAddress, true); // should update the wallet_network ByteBuffer message(comment.begin(), comment.end()); @@ -639,7 +638,6 @@ namespace beam::wallet { if (addr->m_OwnID) { - addr->setLabel(name); if (makeExpired) { addr->makeExpired(); @@ -653,13 +651,9 @@ namespace beam::wallet // set expiration date to 24h since now addr->makeActive(24 * 60 * 60); } - - m_walletDB->saveAddress(*addr); - } - else - { - LOG_ERROR() << "It's not implemented!"; } + addr->setLabel(name); + m_walletDB->saveAddress(*addr); } else { diff --git a/wallet/wallet_db.h b/wallet/wallet_db.h index 01edd9c11..6b13251ff 100644 --- a/wallet/wallet_db.h +++ b/wallet/wallet_db.h @@ -73,7 +73,7 @@ namespace beam::wallet Height m_spentHeight; // height at which the coin was spent boost::optional m_createTxId; // id of the transaction which created the UTXO - boost::optional m_spentTxId; // id of the transaction which spernt the UTXO + boost::optional m_spentTxId; // id of the transaction which spent the UTXO uint64_t m_sessionId; // Used in the API to lock coins for specific session (see https://github.com/BeamMW/beam/wiki/Beam-wallet-protocol-API#tx_split) From e3ad1f1844a9eaf9b9d609911025b38d090e8037 Mon Sep 17 00:00:00 2001 From: szavarza Date: Fri, 26 Jul 2019 10:57:18 +0300 Subject: [PATCH 082/136] travis build fix, TESTNET --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index e09612678..5c1ff1265 100644 --- a/.travis.yml +++ b/.travis.yml @@ -89,6 +89,7 @@ matrix: ############################################################################### - os: linux + dist: trusty language: cpp addons: apt: @@ -134,6 +135,7 @@ matrix: ############################################################################### - os: linux + dist: trusty language: cpp addons: apt: @@ -184,6 +186,7 @@ matrix: ############################################################################### - os: linux + dist: trusty language: android env: - ANDROID_ABI=x86 @@ -225,6 +228,7 @@ matrix: ############################################################################### - os: linux + dist: trusty language: android env: - ANDROID_ABI=x86_64 @@ -266,6 +270,7 @@ matrix: ############################################################################### - os: linux + dist: trusty language: android env: - ANDROID_ABI=armeabi-v7a @@ -307,6 +312,7 @@ matrix: ############################################################################### - os: linux + dist: trusty language: android env: - ANDROID_ABI=arm64-v8a From bdb7897b3e65fbc94a9bcea7f7beadbab4eb70f5 Mon Sep 17 00:00:00 2001 From: anatol Date: Tue, 24 Dec 2019 17:18:43 +0300 Subject: [PATCH 083/136] #1192 fixed tx export function, now it does not export deleted and ill-formed transactions --- wallet/unittests/wallet_db_test.cpp | 28 +++++++++++++ wallet/wallet_db.cpp | 62 +++++++++++++++++++++++++---- wallet/wallet_db.h | 4 +- 3 files changed, 84 insertions(+), 10 deletions(-) diff --git a/wallet/unittests/wallet_db_test.cpp b/wallet/unittests/wallet_db_test.cpp index b262d35f5..e71b2190a 100644 --- a/wallet/unittests/wallet_db_test.cpp +++ b/wallet/unittests/wallet_db_test.cpp @@ -738,6 +738,34 @@ void TestExportImportTx() WALLET_CHECK(walletDB->getTxHistory().size() == 1); _tr = walletDB->getTx(tr2.m_txId); WALLET_CHECK(!_tr.is_initialized()); + + // ill-formed transations + + TxID tx3ID = GenerateTxID(); + + storage::setTxParameter( + *walletDB, + tx3ID, + kDefaultSubTxID, + TxParameterID::MyAddressID, + (*walletDB).AllocateKidRange(1), + false); + storage::setTxParameter( + *walletDB, + tx3ID, + kDefaultSubTxID, + TxParameterID::Amount, + Amount(5), + false); + + exported = storage::ExportDataToJson(*walletDB); + walletDB->deleteTx(tx3ID); + WALLET_CHECK(walletDB->getTxHistory().size() == 1); + WALLET_CHECK(storage::ImportDataFromJson(*walletDB, keyKeeper, &exported[0], exported.size())); + WALLET_CHECK(walletDB->getTxHistory().size() == 1); + _tr = walletDB->getTx(tx3ID); + WALLET_CHECK(!_tr.is_initialized()); + } vector ExtractIDs(const vector& src) diff --git a/wallet/wallet_db.cpp b/wallet/wallet_db.cpp index 88f1fe346..a08652855 100644 --- a/wallet/wallet_db.cpp +++ b/wallet/wallet_db.cpp @@ -2065,6 +2065,7 @@ namespace beam::wallet auto tx = getTx(txId); if (tx.is_initialized()) { + // we left one record about tx type in order to avoid re-launching of deleted transaction const char* req = "DELETE FROM " TX_PARAMS_NAME " WHERE txID=?1 AND paramID!=?2;"; sqlite::Statement stm(this, req); @@ -2344,7 +2345,7 @@ namespace beam::wallet return false; } - auto WalletDB::getAllTxParameters() const -> std::vector + std::vector WalletDB::getAllTxParameters() const { sqlite::Statement stm(this, "SELECT * FROM " TX_PARAMS_NAME ";"); std::vector res; @@ -3103,18 +3104,63 @@ namespace beam::wallet json ExportTransactionsToJson(const IWalletDB& db) { json txParams = json::array(); + map>> exportedParams; + set txIDs; for (const auto& p : db.getAllTxParameters()) { - txParams.push_back( - json + exportedParams[p.m_txID][(SubTxID)p.m_subTxID].emplace((TxParameterID)p.m_paramID, p.m_value); + txIDs.insert(p.m_txID); + } + + array mandatoryTxParams = { + TxParameterID::TransactionType, + TxParameterID::IsSender, + TxParameterID::Amount, + TxParameterID::MyID, + TxParameterID::CreateTime + }; + + for (const auto& tx : txIDs) + { + const auto& params = exportedParams[tx][(int)kDefaultSubTxID]; + + if (params.size() == 1 && params.begin()->first == TxParameterID::TransactionType) // we do not export deleted transactions + { + continue; + } + + bool canExport = true; + for (const auto& mp : mandatoryTxParams) + { + if (params.find(mp) == params.end()) { - {Fields::TransactionId, p.m_txID}, - {Fields::SubTransactionId, p.m_subTxID}, - {Fields::ParameterId, p.m_paramID}, - {Fields::Value, p.m_value} + LOG_WARNING() << "Transaction " << tx << " doesn't have mandatory parameters" << (int)mp << ". Skipping it"; + canExport = false; + break; } - ); + } + if (!canExport) + { + continue; + } + + for (const auto& subTx : exportedParams[tx]) + { + for (const auto& p : subTx.second) + { + txParams.push_back( + json + { + {Fields::TransactionId, tx}, + {Fields::SubTransactionId, subTx.first}, + {Fields::ParameterId, p.first}, + {Fields::Value, p.second} + } + ); + } + } } + return txParams; } } diff --git a/wallet/wallet_db.h b/wallet/wallet_db.h index 00bc4b9e4..185ff0a56 100644 --- a/wallet/wallet_db.h +++ b/wallet/wallet_db.h @@ -299,7 +299,7 @@ namespace beam::wallet virtual bool setTxParameter(const TxID& txID, SubTxID subTxID, TxParameterID paramID, const ByteBuffer& blob, bool shouldNotifyAboutChanges) = 0; virtual bool getTxParameter(const TxID& txID, SubTxID subTxID, TxParameterID paramID, ByteBuffer& blob) const = 0; - virtual auto getAllTxParameters() const -> std::vector = 0; + virtual std::vector getAllTxParameters() const = 0; virtual void rollbackTx(const TxID& txId) = 0; virtual void deleteCoinsCreatedByTx(const TxID& txId) = 0; @@ -411,7 +411,7 @@ namespace beam::wallet bool setTxParameter(const TxID& txID, SubTxID subTxID, TxParameterID paramID, const ByteBuffer& blob, bool shouldNotifyAboutChanges) override; bool getTxParameter(const TxID& txID, SubTxID subTxID, TxParameterID paramID, ByteBuffer& blob) const override; - auto getAllTxParameters() const -> std::vector override; + std::vector getAllTxParameters() const override; Block::SystemState::IHistory& get_History() override; void ShrinkHistory() override; From 4df0e38c6b7aff2d0cda324749b778d05f4f86f8 Mon Sep 17 00:00:00 2001 From: anatol Date: Fri, 17 Jan 2020 15:30:01 +0300 Subject: [PATCH 084/136] fixed address import function for https://github.com/BeamMW/android-wallet/issues/421 --- wallet/wallet_db.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/wallet/wallet_db.cpp b/wallet/wallet_db.cpp index a08652855..9f24c2a6d 100644 --- a/wallet/wallet_db.cpp +++ b/wallet/wallet_db.cpp @@ -2989,6 +2989,7 @@ namespace beam::wallet } LOG_INFO() << "The address [" << jsonAddress[Fields::WalletID] << "] has NOT been imported. Wrong address."; + return false; } return true; } From 49ea28665afdc4e0f8eaea9baa3d0f1f86321944 Mon Sep 17 00:00:00 2001 From: anatol Date: Mon, 20 Jan 2020 14:54:18 +0300 Subject: [PATCH 085/136] fixed transaction import function for https://github.com/BeamMW/android-wallet/issues/421 --- wallet/unittests/wallet_db_test.cpp | 1 + wallet/wallet_db.cpp | 9 ++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/wallet/unittests/wallet_db_test.cpp b/wallet/unittests/wallet_db_test.cpp index e71b2190a..4687b12bf 100644 --- a/wallet/unittests/wallet_db_test.cpp +++ b/wallet/unittests/wallet_db_test.cpp @@ -13,6 +13,7 @@ // limitations under the License. #include "wallet/wallet_db.h" +#include "wallet/base_transaction.h" #include #include "test_helpers.h" #include "utility/test_helpers.h" diff --git a/wallet/wallet_db.cpp b/wallet/wallet_db.cpp index 9f24c2a6d..a26e13aab 100644 --- a/wallet/wallet_db.cpp +++ b/wallet/wallet_db.cpp @@ -3042,14 +3042,14 @@ namespace beam::wallet !wid.IsValid()) { LOG_ERROR() << "Transaction " << txPair.first << " was not imported. Invalid myID parameter"; - continue; + return false; } auto waddr = db.getAddress(wid); if (waddr && (waddr->m_OwnID == 0 || wid != generateWalletIDFromIndex(keyKeeper, waddr->m_OwnID))) { LOG_ERROR() << "Transaction " << txPair.first << " was not imported. Invalid address parameter"; - continue; + return false; } auto addressIt = paramsMap.find(TxParameterID::MyAddressID); @@ -3057,9 +3057,9 @@ namespace beam::wallet wid != generateWalletIDFromIndex(keyKeeper, myAddrId))) { LOG_ERROR() << "Transaction " << txPair.first << " was not imported. Invalid MyAddressID parameter"; - continue; + return false; } - + if (!waddr && addressIt == paramsMap.end()) { LOG_WARNING() << "Transaction " << txPair.first << ". Cannot check imported address"; @@ -3075,7 +3075,6 @@ namespace beam::wallet true); } LOG_INFO() << "Transaction " << txPair.first << " was imported."; - } return true; } From e4efba78b3775e85b13edf09d9372b0d7077cc66 Mon Sep 17 00:00:00 2001 From: anatol Date: Fri, 24 Jan 2020 18:31:16 +0300 Subject: [PATCH 086/136] fixed db test --- wallet/unittests/wallet_db_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/unittests/wallet_db_test.cpp b/wallet/unittests/wallet_db_test.cpp index 4687b12bf..b38ea4382 100644 --- a/wallet/unittests/wallet_db_test.cpp +++ b/wallet/unittests/wallet_db_test.cpp @@ -735,7 +735,7 @@ void TestExportImportTx() exported = storage::ExportDataToJson(*walletDB); walletDB->deleteTx(tr2.m_txId); WALLET_CHECK(walletDB->getTxHistory().size() == 1); - WALLET_CHECK(storage::ImportDataFromJson(*walletDB, keyKeeper, &exported[0], exported.size())); + WALLET_CHECK(!storage::ImportDataFromJson(*walletDB, keyKeeper, &exported[0], exported.size())); WALLET_CHECK(walletDB->getTxHistory().size() == 1); _tr = walletDB->getTx(tr2.m_txId); WALLET_CHECK(!_tr.is_initialized()); From e966d96b0d56f47a7fdb035898c177a7fd982067 Mon Sep 17 00:00:00 2001 From: Anatol Date: Mon, 6 Apr 2020 02:37:56 +0300 Subject: [PATCH 087/136] merge fix --- CMakeLists.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c4f233b4..7d556f281 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -175,7 +175,10 @@ if(SWAP_MAINNET) add_definitions(-DSWAP_MAINNET) endif() -option(BEAM_ATOMIC_SWAP_SUPPORT "Build with wallet with atomic swap support" ON) +option(BEAM_ATOMIC_SWAP_SUPPORT "Build wallet with atomic swap support" ON) +option(BEAM_LASER_SUPPORT "Build wallet with laser support" ON) + +option(BEAM_CONFIDENTIAL_ASSETS_SUPPORT "Build wallet with confidential assets support" ON) option(BEAM_HW_WALLET "Build with hardware wallet support" OFF) @@ -300,12 +303,14 @@ endfunction() if(IOS) set(BEAM_ATOMIC_SWAP_SUPPORT OFF) + set(BEAM_LASER_SUPPORT OFF) add_compile_definitions(BOOST_NO_AUTO_PTR) add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) CreateBoostComponentTargets("${BEAM_BOOST_COMPONENTS}" "$ENV{BOOST_ROOT_IOS}" "lib/libboost_" ".a") elseif(ANDROID) message("ANDROID_ABI: ${ANDROID_ABI}") set(BEAM_ATOMIC_SWAP_SUPPORT OFF) + set(BEAM_LASER_SUPPORT OFF) add_compile_definitions(BOOST_ERROR_CODE_HEADER_ONLY) add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) @@ -321,8 +326,7 @@ elseif(ANDROID) set(ANDROID_SUFFIX "-clang-mt-a64-1_68.a") endif() - CreateBoostComponentTargets("${BEAM_BOOST_COMPONENTS}" "$ENV{BOOST_ROOT_ANDROID}" "libs/${ANDROID_ABI}/libboost_" "${ANDROID_SUFFIX}") - + CreateBoostComponentTargets("${BEAM_BOOST_COMPONENTS}" "$ENV{BOOST_ROOT_ANDROID}" "libs/${ANDROID_ABI}/libboost_" "${ANDROID_SUFFIX}") else() @@ -398,6 +402,7 @@ add_subdirectory(p2p) add_subdirectory(http) add_subdirectory(keykeeper) add_subdirectory(wallet) +add_subdirectory(hw_crypto) add_subdirectory(node) add_subdirectory(mnemonic) From 9e454bd41cd33758de993d2713153ad5cf186ea9 Mon Sep 17 00:00:00 2001 From: anatol Date: Tue, 26 May 2020 16:30:15 +0300 Subject: [PATCH 088/136] commited HF2 for testnet --- core/block_crypt.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/block_crypt.cpp b/core/block_crypt.cpp index 911275436..ce44747c9 100644 --- a/core/block_crypt.cpp +++ b/core/block_crypt.cpp @@ -1611,9 +1611,10 @@ namespace beam ZeroObject(pForks); pForks[1].m_Height = 270910; // testnet fork + pForks[2].m_Height = 690000; // future forks - for (size_t i = 2; i < _countof(pForks); i++) + for (size_t i = 3; i < _countof(pForks); i++) pForks[i].m_Height = MaxHeight; } From 9b4e0297ddc63d9483242d4e0570e614b156c6af Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 2 Jun 2020 14:00:10 +0300 Subject: [PATCH 089/136] ExecutorMT: small refactor, simpler to use in simple scenarios --- core/unittest/ecc_test.cpp | 20 +++----------------- node/node.cpp | 18 ++++++------------ node/node.h | 1 - node/utils/node_net_sim.cpp | 16 +--------------- utility/common.cpp | 23 +++++++++++++++++++++++ utility/executor.h | 8 +++++++- 6 files changed, 40 insertions(+), 46 deletions(-) diff --git a/core/unittest/ecc_test.cpp b/core/unittest/ecc_test.cpp index 330d5fb77..6a8cfd142 100644 --- a/core/unittest/ecc_test.cpp +++ b/core/unittest/ecc_test.cpp @@ -1834,22 +1834,8 @@ void TestLelantus(bool bWithAsset) for (uint32_t iCycle = 0; iCycle < 3; iCycle++) { - struct MyExec - :public beam::ExecutorMT - { - uint32_t m_Threads; - - virtual uint32_t get_Threads() override { return m_Threads; } - - virtual void RunThread(uint32_t iThread) override - { - ExecutorMT::Context ctx; - ctx.m_iThread = iThread; - RunThreadCtx(ctx); - } - } ex; - - ex.m_Threads = 1 << iCycle; + beam::ExecutorMT ex; + ex.set_Threads(1 << iCycle); beam::Executor::Scope scope(ex); @@ -1861,7 +1847,7 @@ void TestLelantus(bool bWithAsset) p.Generate(Zero, oracle, &hGen); if (!bWithAsset) - printf("\tProof time = %u ms, Threads=%u\n", beam::GetTime_ms() - t, ex.m_Threads); + printf("\tProof time = %u ms, Threads=%u\n", beam::GetTime_ms() - t, ex.get_Threads()); // serialization beam::Serializer ser_; diff --git a/node/node.cpp b/node/node.cpp index 24abcc350..a60fa3c83 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -689,18 +689,6 @@ void Node::Processor::OnRolledBack() pObserver->OnRolledBack(m_Cursor.m_ID); } -uint32_t Node::Processor::MyExecutorMT::get_Threads() -{ - Config& cfg = get_ParentObj().get_ParentObj().m_Cfg; // alias - - if (cfg.m_VerificationThreads < 0) - // use all the cores, don't subtract 'mining threads'. Verification has higher priority - cfg.m_VerificationThreads = std::thread::hardware_concurrency(); - - uint32_t nThreads = cfg.m_VerificationThreads; - return std::max(nThreads, 1U); -} - void Node::Processor::MyExecutorMT::RunThread(uint32_t iThread) { MyExecutor::MyContext ctx; @@ -857,6 +845,12 @@ void Node::Keys::SetSingleKey(const Key::IKdf::Ptr& pKdf) void Node::Initialize(IExternalPOW* externalPOW) { + if (m_Cfg.m_VerificationThreads < 0) + // use all the cores, don't subtract 'mining threads'. Verification has higher priority + m_Cfg.m_VerificationThreads = m_Processor.m_ExecutorMT.get_Threads(); + + m_Processor.m_ExecutorMT.set_Threads(std::max(m_Cfg.m_VerificationThreads, 1U)); + m_Processor.m_Horizon = m_Cfg.m_Horizon; m_Processor.Initialize(m_Cfg.m_sPathLocal.c_str(), m_Cfg.m_ProcessorParams); diff --git a/node/node.h b/node/node.h index f58a93d92..9aae82555 100644 --- a/node/node.h +++ b/node/node.h @@ -219,7 +219,6 @@ struct Node struct MyExecutorMT :public ExecutorMT { - virtual uint32_t get_Threads() override; virtual void RunThread(uint32_t) override; ~MyExecutorMT() { Stop(); } diff --git a/node/utils/node_net_sim.cpp b/node/utils/node_net_sim.cpp index c8dc99524..7fd153a32 100644 --- a/node/utils/node_net_sim.cpp +++ b/node/utils/node_net_sim.cpp @@ -432,7 +432,6 @@ struct Context Context() :m_Network(m_FlyClient) { - m_Exec.m_Threads = std::thread::hardware_concurrency(); } struct Cfg @@ -452,20 +451,7 @@ struct Context } m_Cfg; - struct Exec - :public beam::ExecutorMT - { - uint32_t m_Threads; - - virtual uint32_t get_Threads() override { return m_Threads; } - - virtual void RunThread(uint32_t iThread) override - { - ExecutorMT::Context ctx; - ctx.m_iThread = iThread; - RunThreadCtx(ctx); - } - } m_Exec; + beam::ExecutorMT m_Exec; void OnRolledBack() diff --git a/utility/common.cpp b/utility/common.cpp index 67663f8f7..07b73b697 100644 --- a/utility/common.cpp +++ b/utility/common.cpp @@ -136,6 +136,22 @@ namespace beam return static_cast(val); } + ExecutorMT::ExecutorMT() + { + m_Threads = std::thread::hardware_concurrency(); + } + + void ExecutorMT::set_Threads(uint32_t nThreads) + { + Stop(); + m_Threads = nThreads; + } + + uint32_t ExecutorMT::get_Threads() + { + return m_Threads; + } + void ExecutorMT::InitSafe() { if (!m_vThreads.empty()) @@ -227,6 +243,13 @@ namespace beam } } + void ExecutorMT::RunThread(uint32_t iThread) + { + Context ctx; + ctx.m_iThread = iThread; + RunThreadCtx(ctx); + } + void ExecutorMT::RunThreadCtx(Context& ctx) { ctx.m_pThis = this; diff --git a/utility/executor.h b/utility/executor.h index 23fae8793..2ff0e8139 100644 --- a/utility/executor.h +++ b/utility/executor.h @@ -73,16 +73,22 @@ namespace beam struct ExecutorMT :public Executor { + virtual uint32_t get_Threads() override; virtual void Push(TaskAsync::Ptr&&) override; virtual uint32_t Flush(uint32_t nMaxTasks) override; virtual void ExecAll(TaskSync&) override; + ExecutorMT(); ~ExecutorMT() { Stop(); } void Stop(); + void set_Threads(uint32_t); + protected: - virtual void RunThread(uint32_t) = 0; // override this, create the appropriate context, and call the next + uint32_t m_Threads; // set at c'tor to num of cores. + + virtual void RunThread(uint32_t); // optionally override this, create the appropriate context, and call the next void RunThreadCtx(Context&); private: From ea1c3460a24b88b829ea8c274a6347556a8fb5dc Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 2 Jun 2020 14:05:06 +0300 Subject: [PATCH 090/136] pull_tx_builder: multi-threaded Lelantus proof generator --- wallet/transactions/lelantus/pull_tx_builder.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/wallet/transactions/lelantus/pull_tx_builder.cpp b/wallet/transactions/lelantus/pull_tx_builder.cpp index ceeb3313e..33cac9516 100644 --- a/wallet/transactions/lelantus/pull_tx_builder.cpp +++ b/wallet/transactions/lelantus/pull_tx_builder.cpp @@ -15,6 +15,7 @@ #include "pull_tx_builder.h" #include "core/shielded.h" +#include "utility/executor.h" #include @@ -176,7 +177,12 @@ namespace beam::wallet::lelantus prover.m_Witness.V.m_V = IsAssetTx() ? GetAmount() : GetAmount() + GetFee(); } - pKrn->Sign(prover, GetAssetId()); + { + ExecutorMT exec; + Executor::Scope scope(exec); + pKrn->Sign(prover, GetAssetId()); + } + m_Tx.SetParameter(TxParameterID::KernelID, pKrn->m_Internal.m_ID); LOG_INFO() << m_Tx.GetTxID() << "[" << m_SubTxID << "]" From 21e23f8a6049031d1615e275d3683602fa447efe Mon Sep 17 00:00:00 2001 From: valdok Date: Thu, 4 Jun 2020 10:48:23 +0300 Subject: [PATCH 091/136] Node: fixed potential fasy-sync fail if blocks were requested before entering fast-sync mode --- node/node.cpp | 16 ++++++++++++++-- node/node.h | 3 +++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index a60fa3c83..0c4fcbe4c 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -401,6 +401,9 @@ bool Node::TryAssignTask(Task& t, Peer& p) t.m_nCount = std::min(static_cast(msg.m_CountExtra), m_Cfg.m_BandwidthCtl.m_MaxBodyPackCount) + 1; // just an estimate, the actual num of blocks can be smaller m_nTasksPackBody += t.m_nCount; + + t.m_h0 = m_Processor.m_SyncData.m_h0; + t.m_hTxoLo = m_Processor.m_SyncData.m_TxoLo; } else { @@ -1919,6 +1922,13 @@ bool Node::Peer::GetBlock(proto::BodyBuffers& out, const NodeDB::StateID& sid, c return true; } +bool Node::Peer::ShouldAcceptBodyPack() +{ + Task& t = get_FirstTask(); + const NodeProcessor::SyncData& d = m_This.m_Processor.m_SyncData; // alias + return (t.m_h0 == d.m_h0) && (t.m_hTxoLo == d.m_TxoLo); +} + void Node::Peer::OnMsg(proto::Body&& msg) { Task& t = get_FirstTask(); @@ -1934,7 +1944,9 @@ void Node::Peer::OnMsg(proto::Body&& msg) Processor& p = m_This.m_Processor; // alias NodeProcessor::DataStatus::Enum eStatus = h ? - p.OnBlock(id, msg.m_Body.m_Perishable, msg.m_Body.m_Eternal, m_pInfo->m_ID.m_Key) : + ShouldAcceptBodyPack() ? + p.OnBlock(id, msg.m_Body.m_Perishable, msg.m_Body.m_Eternal, m_pInfo->m_ID.m_Key) : + NodeProcessor::DataStatus::Rejected : p.OnTreasury(msg.m_Body.m_Eternal); p.TryGoUpAsync(); @@ -1967,7 +1979,7 @@ void Node::Peer::OnMsg(proto::BodyPack&& msg) ModifyRatingWrtData(nSize); NodeProcessor::DataStatus::Enum eStatus = NodeProcessor::DataStatus::Rejected; - if (!msg.m_Bodies.empty()) + if (!msg.m_Bodies.empty() && ShouldAcceptBodyPack()) { const uint64_t* pPtr = p.get_CachedRows(t.m_sidTrg, hCountExtra); if (pPtr) diff --git a/node/node.h b/node/node.h index 9aae82555..400eb9945 100644 --- a/node/node.h +++ b/node/node.h @@ -269,6 +269,8 @@ struct Node uint32_t m_nCount; uint32_t m_TimeAssigned_ms; NodeDB::StateID m_sidTrg; + Height m_h0; // those 2 are fast-sync params at the moment of task assignment + Height m_hTxoLo; Peer* m_pOwner; bool operator < (const Task& t) const { return (m_Key < t.m_Key); } @@ -510,6 +512,7 @@ struct Node bool ShouldAssignTasks(); bool ShouldFinalizeMining(); Task& get_FirstTask(); + bool ShouldAcceptBodyPack(); void OnFirstTaskDone(); void OnFirstTaskDone(NodeProcessor::DataStatus::Enum); void ModifyRatingWrtData(size_t nSize); From a69ee01b70e7afd3f7c8a46944872586c8179546 Mon Sep 17 00:00:00 2001 From: valdok Date: Fri, 5 Jun 2020 13:24:55 +0300 Subject: [PATCH 092/136] WalletDB::ImportRecovery() - handling shielded events --- wallet/core/wallet_db.cpp | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/wallet/core/wallet_db.cpp b/wallet/core/wallet_db.cpp index 78a53e040..3051ba7c2 100644 --- a/wallet/core/wallet_db.cpp +++ b/wallet/core/wallet_db.cpp @@ -2103,6 +2103,60 @@ namespace beam::wallet return true; } + + typedef std::map ShieldedSpendKeyMap; + ShieldedSpendKeyMap m_mapShielded; + + virtual bool OnAssetRecognized(Asset::Full&) override + { + // TODO + return true; + } + + virtual bool OnShieldedOutRecognized(const ShieldedTxo::DescriptionOutp& dout, const ShieldedTxo::DataParams& pars, Key::Index nIdx) override + { + ShieldedCoin sc; + + sc.m_Key.m_nIdx = nIdx; + sc.m_Key.m_IsCreatedByViewer = pars.m_Ticket.m_IsCreatedByViewer; + sc.m_Key.m_kSerG = pars.m_Ticket.m_pK[0]; + + sc.m_User = pars.m_Output.m_User; + sc.m_ID = dout.m_ID; + sc.m_assetID = pars.m_Output.m_AssetID; + sc.m_value = pars.m_Output.m_Value; + sc.m_confirmHeight = dout.m_Height; + sc.m_spentHeight = MaxHeight; + + m_This.saveShieldedCoin(sc); + + LOG_INFO() << "Shielded output, ID: " << dout.m_ID << " Confirmed, Height=" << dout.m_Height; + + m_mapShielded[pars.m_Ticket.m_SpendPk] = sc.m_Key; + + return true; + } + + virtual bool OnShieldedIn(const ShieldedTxo::DescriptionInp& dinp) + { + ShieldedSpendKeyMap::iterator it = m_mapShielded.find(dinp.m_SpendPk); + if (m_mapShielded.end() != it) + { + auto shieldedCoin = m_This.getShieldedCoin(it->second); + if (shieldedCoin) + { + shieldedCoin->m_spentHeight = dinp.m_Height; + m_This.saveShieldedCoin(*shieldedCoin); + + LOG_INFO() << "Shielded input, ID: " << shieldedCoin->m_ID << " Spent, Height=" << dinp.m_Height; + } + + m_mapShielded.erase(it); + } + + return true; + } + }; MyParser p(*this, prog); From f57aee8a4cff8fe34b12c7bd9bd81d6ebbb79903 Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 9 Jun 2020 11:29:13 +0300 Subject: [PATCH 093/136] proto::LoginFlags: changed extension numbering to sequential counter (instead of bits) --- core/proto.cpp | 46 +++++++++++++++++++++++++++++----------------- core/proto.h | 26 ++++++++++++++------------ node/node.cpp | 4 ++-- 3 files changed, 45 insertions(+), 31 deletions(-) diff --git a/core/proto.cpp b/core/proto.cpp index 590d896f1..dd279e6d2 100644 --- a/core/proto.cpp +++ b/core/proto.cpp @@ -608,10 +608,30 @@ void NodeConnection::OnMsg(SChannelInitiate&& msg) OnConnectedSecure(); } +void LoginFlags::Extension::set(uint32_t& nFlags, uint8_t nExt) +{ + assert(!(nFlags & Msk)); + + static const uint32_t nShift = 4; + static_assert(((Msk >> nShift) << nShift) == Msk); // no bits are lost in shifts + static_assert((Msk >> nShift) == static_cast(-1)); // at correct position + + nFlags |= static_cast(nExt) << nShift; +} + +uint8_t LoginFlags::Extension::get(uint32_t nFlags) +{ + static const uint32_t nShift = 4; + static_assert(((Msk >> nShift) << nShift) == Msk); // no bits are lost in shifts + static_assert((Msk >> nShift) == static_cast(-1)); // at correct position + + return static_cast(nFlags >> nShift); +} + void NodeConnection::SendLogin() { Login msg; - msg.m_Flags = LoginFlags::ExtensionsAll; + LoginFlags::Extension::set(msg.m_Flags, LoginFlags::Extension::Maximum); SetupLogin(msg); const Rules& r = Rules::get(); @@ -730,23 +750,15 @@ void NodeConnection::OnMsg(Login&& msg) void NodeConnection::OnLoginInternal(Login&& msg) { - if (LoginFlags::ExtensionsBeforeHF1 != (LoginFlags::ExtensionsBeforeHF1 & msg.m_Flags)) - { - LOG_WARNING() << "Peer " << m_Connection->peer_address() << " uses legacy protocol"; - ThrowUnexpected("Legacy", NodeProcessingException::Type::Incompatible); - } + uint8_t nExt = LoginFlags::Extension::get(msg.m_Flags); + if (LoginFlags::Extension::Maximum != nExt) + { + bool bNewer = (nExt > LoginFlags::Extension::Maximum); + LOG_WARNING() << "Peer " << m_Connection->peer_address() << " uses " << (bNewer ? "newer" : "older") << " ext: " << nExt; - if ((~LoginFlags::Recognized) & msg.m_Flags) { - LOG_WARNING() << "Peer " << m_Connection->peer_address() << " Uses newer protocol."; - } - else - { - const uint32_t nMask = LoginFlags::ExtensionsAll; - uint32_t nFlags2 = nMask & msg.m_Flags; - if (nFlags2 != nMask) { - LOG_WARNING() << "Peer " << m_Connection->peer_address() << " Uses older protocol: " << nFlags2; - } - } + if (nExt < LoginFlags::Extension::Minimum) + ThrowUnexpected("Legacy", NodeProcessingException::Type::Incompatible); + } OnLogin(std::move(msg)); } diff --git a/core/proto.h b/core/proto.h index 7cdf96947..c93f0558b 100644 --- a/core/proto.h +++ b/core/proto.h @@ -317,21 +317,23 @@ namespace proto { static const uint32_t Bbs = 0x2; // I'm spreading bbs messages static const uint32_t SendPeers = 0x4; // Please send me periodically peers recommendations static const uint32_t MiningFinalization = 0x8; // I want to finalize block construction for my owned node - static const uint32_t Extension1 = 0x10; // Supports Bbs with POW, more advanced proof/disproof scheme for SPV clients (?) - static const uint32_t Extension2 = 0x20; // Supports large HdrPack, BlockPack with parameters - static const uint32_t Extension3 = 0x40; // Supports Login1, Status (former Boolean) for NewTransaction result, compatible with Fork H1 - static const uint32_t Extension4 = 0x80; // Supports proto::Events (replaces proto::EventsLegacy) - static const uint32_t Recognized = 0xff; + struct Extension + { + static const uint32_t Msk = 0xff0; + + // 1 - Supports Bbs with POW, more advanced proof/disproof scheme for SPV clients (?) + // 3 - Supports large HdrPack, BlockPack with parameters + // 7 - Supports Login1, Status (former Boolean) for NewTransaction result, compatible with Fork H1 + static const uint8_t Minimum = 7; - static const uint32_t ExtensionsBeforeHF1 = - Extension1 | - Extension2 | - Extension3; + // 15 - Supports proto::Events (replaces proto::EventsLegacy) - static const uint32_t ExtensionsAll = - ExtensionsBeforeHF1 | - Extension4; + static const uint8_t Maximum = 15; + + static void set(uint32_t& nFlags, uint8_t nExt); + static uint8_t get(uint32_t nFlags); + }; }; struct IDType diff --git a/node/node.cpp b/node/node.cpp index 0c4fcbe4c..ae2994a71 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -3374,7 +3374,7 @@ void Node::Peer::OnMsg(proto::GetEvents&& msg) ser & wlk.m_Height; ser.WriteRaw(wlk.m_Body.p, wlk.m_Body.n); - nCount++; + nCount++; } ser.swap_buf(msgOut.m_Events); @@ -3382,7 +3382,7 @@ void Node::Peer::OnMsg(proto::GetEvents&& msg) else LOG_WARNING() << "Peer " << m_RemoteAddr << " Unauthorized Utxo events request."; - if (proto::LoginFlags::Extension4 & m_LoginFlags) + if (proto::LoginFlags::Extension::get(m_LoginFlags) >= 15) { Send(msgOut); } From 3c01860a7f828da313fa71231df4bde1681835a1 Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 9 Jun 2020 12:14:53 +0300 Subject: [PATCH 094/136] misc --- core/proto.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/proto.cpp b/core/proto.cpp index dd279e6d2..b998aec63 100644 --- a/core/proto.cpp +++ b/core/proto.cpp @@ -754,7 +754,7 @@ void NodeConnection::OnLoginInternal(Login&& msg) if (LoginFlags::Extension::Maximum != nExt) { bool bNewer = (nExt > LoginFlags::Extension::Maximum); - LOG_WARNING() << "Peer " << m_Connection->peer_address() << " uses " << (bNewer ? "newer" : "older") << " ext: " << nExt; + LOG_WARNING() << "Peer " << m_Connection->peer_address() << " uses " << (bNewer ? "newer" : "older") << " ext: " << static_cast(nExt); if (nExt < LoginFlags::Extension::Minimum) ThrowUnexpected("Legacy", NodeProcessingException::Type::Incompatible); From 1a7f7d4d11f6729d93ce0715181bde3236025ec6 Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 9 Jun 2020 12:16:00 +0300 Subject: [PATCH 095/136] Node: recording Events Serif, invalidating it each time the UTXO rescan took place --- node/db.h | 3 ++- node/node.cpp | 21 +++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/node/db.h b/node/db.h index 3c1625923..ea89614f1 100644 --- a/node/db.h +++ b/node/db.h @@ -49,7 +49,7 @@ class NodeDB SyncTarget, // deprecated Deprecated_2, Treasury, - DummyID, // hash of keys used to create UTXOs (owner key, dummy key) + EventsOwnerID, // hash of keys used to scan and record events HeightTxoLo, // Height starting from which and below Txo info is totally erased. HeightTxoHi, // Height starting from which and below Txo infi is compacted, only the commitment is left SyncData, @@ -59,6 +59,7 @@ class NodeDB ShieldedInputs, AssetsCount, // Including unused. The last element is guaranteed to be used. AssetsCountUsed, // num of 'live' assets + EventsSerif, // pseudo-random, reset each time the events are rescanned. }; }; diff --git a/node/node.cpp b/node/node.cpp index ae2994a71..fcd90e0c0 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -991,15 +991,24 @@ void Node::RefreshOwnedUtxos() hp >> hv0; Blob blob(hv1); - m_Processor.get_DB().ParamGet(NodeDB::ParamID::DummyID, NULL, &blob); + m_Processor.get_DB().ParamGet(NodeDB::ParamID::EventsOwnerID, NULL, &blob); - if (hv0 == hv1) - return; // unchanged + bool bChanged = (hv0 != hv1); + if (bChanged) + { + // changed + m_Processor.RescanOwnedTxos(); - m_Processor.RescanOwnedTxos(); + blob = Blob(hv0); + m_Processor.get_DB().ParamSet(NodeDB::ParamID::EventsOwnerID, NULL, &blob); + } - blob = Blob(hv0); - m_Processor.get_DB().ParamSet(NodeDB::ParamID::DummyID, NULL, &blob); + if (bChanged || !m_Processor.get_DB().ParamGet(NodeDB::ParamID::EventsSerif, nullptr, &blob)) + { + hv0 = NextNonce(); + blob = Blob(hv0); + m_Processor.get_DB().ParamSet(NodeDB::ParamID::EventsSerif, nullptr, &blob); + } } bool Node::Bbs::IsInLimits() const From c48381e70b49de501cd942286a32971b1937d01a Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 9 Jun 2020 12:19:46 +0300 Subject: [PATCH 096/136] Node: sending EventsSerif to the owner/viewer --- core/proto.h | 7 ++++++- node/node.cpp | 20 ++++++++++++++++++++ node/node.h | 2 ++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/core/proto.h b/core/proto.h index c93f0558b..551e3bd64 100644 --- a/core/proto.h +++ b/core/proto.h @@ -220,6 +220,9 @@ namespace proto { #define BeamNodeMsg_Events(macro) \ macro(ByteBuffer, Events) +#define BeamNodeMsg_EventsSerif(macro) \ + macro(ECC::Hash::Value, Value) + #define BeamNodeMsg_GetBlockFinalization(macro) \ macro(Height, Height) \ macro(Amount, Fees) @@ -293,6 +296,7 @@ namespace proto { macro(0x2c, GetEvents) \ macro(0x2d, EventsLegacy) \ macro(0x34, Events) \ + macro(0x37, EventsSerif) \ macro(0x2e, GetBlockFinalization) \ macro(0x2f, BlockFinalization) \ /* tx broadcast and replication */ \ @@ -328,8 +332,9 @@ namespace proto { static const uint8_t Minimum = 7; // 15 - Supports proto::Events (replaces proto::EventsLegacy) + // 16 - Supports Events serif - static const uint8_t Maximum = 15; + static const uint8_t Maximum = 16; static void set(uint32_t& nFlags, uint8_t nExt); static uint8_t get(uint32_t nFlags); diff --git a/node/node.cpp b/node/node.cpp index fcd90e0c0..75d22a508 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -1212,6 +1212,8 @@ void Node::Peer::OnMsg(proto::Authentication&& msg) } } + MaybeSendSerif(); + if (proto::IDType::Node != msg.m_IDType) return; @@ -2657,6 +2659,7 @@ void Node::Peer::OnLogin(proto::Login&& msg) } m_LoginFlags = msg.m_Flags; + MaybeSendSerif(); if (b != ShouldFinalizeMining()) { // stupid compiler insists on parentheses! @@ -2767,6 +2770,23 @@ void Node::Peer::BroadcastBbs() m_CursorBbs = wlk.m_ID; } +void Node::Peer::MaybeSendSerif() +{ + if (!(Flags::Viewer & m_Flags) || (Flags::SerifSent & m_Flags)) + return; + + if (proto::LoginFlags::Extension::get(m_LoginFlags) < 16) + return; + + proto::EventsSerif msg; + + Blob blob(msg.m_Value); + m_This.m_Processor.get_DB().ParamGet(NodeDB::ParamID::EventsSerif, nullptr, &blob); + + Send(msg); + m_Flags |= Flags::SerifSent; +} + void Node::Peer::OnMsg(proto::HaveTransaction&& msg) { TxPool::Fluff::Element::Tx key; diff --git a/node/node.h b/node/node.h index 400eb9945..0668ac021 100644 --- a/node/node.h +++ b/node/node.h @@ -464,6 +464,7 @@ struct Node static const uint16_t PiRcvd = 0x002; static const uint16_t Owner = 0x004; static const uint16_t Probe = 0x008; + static const uint16_t SerifSent = 0x010; static const uint16_t Finalizing = 0x080; static const uint16_t HasTreasury = 0x100; static const uint16_t Chocking = 0x200; @@ -504,6 +505,7 @@ struct Node void BroadcastTxs(); void BroadcastBbs(); void BroadcastBbs(Bbs::Subscription&); + void MaybeSendSerif(); void OnChocking(); void SetTxCursor(TxPool::Fluff::Element*); bool GetBlock(proto::BodyBuffers&, const NodeDB::StateID&, const proto::GetBodyPack&, bool bActive); From 907a1691ff02690f06d01899604315657f383dc6 Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 9 Jun 2020 13:39:44 +0300 Subject: [PATCH 097/136] Node: Events Serif with height --- core/proto.h | 3 ++- node/node.cpp | 9 +++++---- node/processor.cpp | 7 +++++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/core/proto.h b/core/proto.h index 551e3bd64..9248951d9 100644 --- a/core/proto.h +++ b/core/proto.h @@ -221,7 +221,8 @@ namespace proto { macro(ByteBuffer, Events) #define BeamNodeMsg_EventsSerif(macro) \ - macro(ECC::Hash::Value, Value) + macro(ECC::Hash::Value, Value) \ + macro(Height, Height) \ #define BeamNodeMsg_GetBlockFinalization(macro) \ macro(Height, Height) \ diff --git a/node/node.cpp b/node/node.cpp index 75d22a508..627438dba 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -1007,7 +1007,7 @@ void Node::RefreshOwnedUtxos() { hv0 = NextNonce(); blob = Blob(hv0); - m_Processor.get_DB().ParamSet(NodeDB::ParamID::EventsSerif, nullptr, &blob); + m_Processor.get_DB().ParamSet(NodeDB::ParamID::EventsSerif, &m_Processor.m_Extra.m_TxoHi, &blob); } } @@ -2781,7 +2781,7 @@ void Node::Peer::MaybeSendSerif() proto::EventsSerif msg; Blob blob(msg.m_Value); - m_This.m_Processor.get_DB().ParamGet(NodeDB::ParamID::EventsSerif, nullptr, &blob); + m_This.m_Processor.get_DB().ParamGet(NodeDB::ParamID::EventsSerif, &msg.m_Height, &blob); Send(msg); m_Flags |= Flags::SerifSent; @@ -4410,8 +4410,9 @@ void Node::PrintTxos() if (m_Processor.IsFastSync()) os << "Note: Fast-sync is in progress. Data is preliminary and not fully verified yet." << std::endl; - if (m_Processor.m_Extra.m_TxoHi >= Rules::HeightGenesis) - os << "Note: Cut-through up to Height=" << m_Processor.m_Extra.m_TxoHi << ", Txos spent earlier may be missing. To recover them too please make full sync." << std::endl; + Height hSerif0 = m_Processor.get_DB().ParamIntGetDef(NodeDB::ParamID::EventsSerif); + if (hSerif0 >= Rules::HeightGenesis) + os << "Note: Cut-through up to Height=" << hSerif0 << ", Txos spent earlier may be missing. To recover them too please make full sync." << std::endl; NodeDB::WalkerEvent wlk; for (m_Processor.get_DB().EnumEvents(wlk, Rules::HeightGenesis - 1); wlk.MoveNext(); ) diff --git a/node/processor.cpp b/node/processor.cpp index d558d8ab3..b0b6da033 100644 --- a/node/processor.cpp +++ b/node/processor.cpp @@ -1595,6 +1595,13 @@ void NodeProcessor::OnFastSyncOver(MultiblockContext& mbc, bool& bContextFail) ZeroObject(m_SyncData); SaveSyncData(); + + // update Events serif + ECC::Hash::Value hv; + Blob blob(hv); + if (m_DB.ParamGet(NodeDB::ParamID::EventsSerif, nullptr, &blob)) + m_DB.ParamSet(NodeDB::ParamID::EventsSerif, &m_Extra.m_TxoHi, &blob); + } } From e16a5a195936e203466841489dc752468b96c165 Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 9 Jun 2020 15:02:53 +0300 Subject: [PATCH 098/136] Node: making sure Events serif is resent after each fast-sync --- node/node.cpp | 18 ++++++++++++++++++ node/node.h | 1 + node/processor.cpp | 7 +------ node/processor.h | 1 + 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index 627438dba..a53a458b1 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -618,6 +618,24 @@ void Node::Processor::OnNewState() get_ParentObj().MaybeGenerateRecovery(); } +void Node::Processor::OnFastSyncSucceeded() +{ + // update Events serif + ECC::Hash::Value hv; + Blob blob(hv); + if (!get_DB().ParamGet(NodeDB::ParamID::EventsSerif, nullptr, &blob)) + return; //?! + + get_DB().ParamSet(NodeDB::ParamID::EventsSerif, &m_Extra.m_TxoHi, &blob); + + for (PeerList::iterator it = get_ParentObj().m_lstPeers.begin(); get_ParentObj().m_lstPeers.end() != it; it++) + { + Peer& peer = *it; + peer.m_Flags &= ~Peer::Flags::SerifSent; + peer.MaybeSendSerif(); + } +} + void Node::MaybeGenerateRecovery() { if (!m_PostStartSynced || m_Cfg.m_Recovery.m_sPathOutput.empty() || !m_Cfg.m_Recovery.m_Granularity) diff --git a/node/node.h b/node/node.h index 0668ac021..e3def9303 100644 --- a/node/node.h +++ b/node/node.h @@ -210,6 +210,7 @@ struct Node void OnNewState() override; void OnRolledBack() override; void OnModified() override; + void OnFastSyncSucceeded() override; void get_ViewerKeys(ViewerKeys&) override; void OnEvent(Height, const proto::Event::Base&) override; void OnDummy(const CoinID&, Height) override; diff --git a/node/processor.cpp b/node/processor.cpp index b0b6da033..bd8201720 100644 --- a/node/processor.cpp +++ b/node/processor.cpp @@ -1596,12 +1596,7 @@ void NodeProcessor::OnFastSyncOver(MultiblockContext& mbc, bool& bContextFail) ZeroObject(m_SyncData); SaveSyncData(); - // update Events serif - ECC::Hash::Value hv; - Blob blob(hv); - if (m_DB.ParamGet(NodeDB::ParamID::EventsSerif, nullptr, &blob)) - m_DB.ParamSet(NodeDB::ParamID::EventsSerif, &m_Extra.m_TxoHi, &blob); - + OnFastSyncSucceeded(); } } diff --git a/node/processor.h b/node/processor.h index e32c31d0c..47bf2e1c4 100644 --- a/node/processor.h +++ b/node/processor.h @@ -326,6 +326,7 @@ class NodeProcessor virtual void OnRolledBack() {} virtual void OnModified() {} virtual void InitializeUtxosProgress(uint64_t done, uint64_t total) {} + virtual void OnFastSyncSucceeded() {} struct MyExecutor :public Executor From e0a4c14ea53cd47783400ff66bc6f2cfa19ce179 Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 9 Jun 2020 15:04:26 +0300 Subject: [PATCH 099/136] Wallet: responding to Node EventsSerif. Auto rescanning events if necessary --- core/fly_client.cpp | 9 +++++++++ core/fly_client.h | 2 ++ wallet/core/wallet.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ wallet/core/wallet.h | 1 + 4 files changed, 52 insertions(+) diff --git a/core/fly_client.cpp b/core/fly_client.cpp index 3cd13210c..729b49073 100644 --- a/core/fly_client.cpp +++ b/core/fly_client.cpp @@ -915,5 +915,14 @@ void FlyClient::NetworkStd::Connection::OnMsg(BbsMsg&& msg) } } +void FlyClient::NetworkStd::Connection::OnMsg(EventsSerif&& msg) +{ + if (!(Flags::Owned & m_Flags)) + ThrowUnexpected(); + + // TODO: handle complex situation, where multiple owned nodes are connected + m_This.m_Client.OnEventsSerif(msg.m_Value, msg.m_Height); +} + } // namespace proto } // namespace beam diff --git a/core/fly_client.h b/core/fly_client.h index 8c384cf73..19d1a9ad2 100644 --- a/core/fly_client.h +++ b/core/fly_client.h @@ -87,6 +87,7 @@ namespace proto { virtual void get_OwnerKdf(Key::IPKdf::Ptr&) {} // get the owner kdf. Optional virtual Block::SystemState::IHistory& get_History() = 0; virtual void OnOwnedNode(const PeerID&, bool bUp) {} + virtual void OnEventsSerif(const ECC::Hash::Value&, Height) {} struct IBbsReceiver { @@ -216,6 +217,7 @@ namespace proto { virtual void OnMsg(proto::ProofCommonState&& msg) override; virtual void OnMsg(proto::ProofChainWork&& msg) override; virtual void OnMsg(proto::BbsMsg&& msg) override; + virtual void OnMsg(proto::EventsSerif&& msg) override; #define THE_MACRO(type, msgOut, msgIn) \ virtual void OnMsg(proto::msgIn&&) override; \ bool IsSupported(Request##type&); \ diff --git a/wallet/core/wallet.cpp b/wallet/core/wallet.cpp index 76738186c..3ba39e263 100644 --- a/wallet/core/wallet.cpp +++ b/wallet/core/wallet.cpp @@ -164,6 +164,8 @@ namespace beam::wallet // Rescan the blockchain for UTXOs void Wallet::Rescan() { + AbortEvents(); + // We save all Incoming coins of active transactions and // restore them after clearing db. This will save our outgoing & available amounts std::vector ocoins; @@ -1072,6 +1074,44 @@ namespace beam::wallet } } + void Wallet::OnEventsSerif(const Hash::Value& hv, Height h) + { + static const char szEvtSerif[] = "EventsSerif"; + + HeightHash hh; + if (!storage::getVar(*m_WalletDB, szEvtSerif, hh)) + { + hh.m_Hash = Zero; + + Block::SystemState::Full sTip; + get_tip(sTip); + + bool bWasFullySynced = (sTip.m_Height + 1 == GetEventsHeightNext()); + hh.m_Height = bWasFullySynced ? sTip.m_Height : MaxHeight; + } + + bool bMustRescan = (hh.m_Hash != hv); + if (bMustRescan) + { + // Node Serif has changed (either connected to different node, or it rescanned the blockchain). The events stream may not be consistent with ours. + Height h0 = GetEventsHeightNext(); + if (!h0) + bMustRescan = false; // nothing to rescan atm + else + { + if (h0 > hh.m_Height) + { + // Our events are consistent and full up to height h0-1. + bMustRescan = (h >= h0); + } + } + } + + if (bMustRescan) + Rescan(); + + } + void Wallet::OnNewTip() { m_WalletDB->ShrinkHistory(); diff --git a/wallet/core/wallet.h b/wallet/core/wallet.h index dea1278c8..4bc0e3608 100644 --- a/wallet/core/wallet.h +++ b/wallet/core/wallet.h @@ -167,6 +167,7 @@ namespace beam::wallet void get_OwnerKdf(Key::IPKdf::Ptr&) override; Block::SystemState::IHistory& get_History() override; void OnOwnedNode(const PeerID&, bool bUp) override; + void OnEventsSerif(const ECC::Hash::Value&, Height) override; struct RequestHandler : public proto::FlyClient::Request::IHandler From 188a64176a1e5e396cebea27119ca1ad45c97dee Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 9 Jun 2020 17:30:51 +0300 Subject: [PATCH 100/136] protoproto::LoginFlags: fixed encoding of extenschanged extension version to be compatible with legacy. --- core/proto.cpp | 33 +++++++++++++++++++++------------ core/proto.h | 23 +++++++++++++---------- core/unittest/ecc_test.cpp | 25 +++++++++++++++++++++++++ node/node.cpp | 4 ++-- 4 files changed, 61 insertions(+), 24 deletions(-) diff --git a/core/proto.cpp b/core/proto.cpp index b998aec63..4ca65b5a0 100644 --- a/core/proto.cpp +++ b/core/proto.cpp @@ -608,24 +608,33 @@ void NodeConnection::OnMsg(SChannelInitiate&& msg) OnConnectedSecure(); } -void LoginFlags::Extension::set(uint32_t& nFlags, uint8_t nExt) +void LoginFlags::Extension::set(uint32_t& nFlags, uint32_t nExt) { assert(!(nFlags & Msk)); - static const uint32_t nShift = 4; - static_assert(((Msk >> nShift) << nShift) == Msk); // no bits are lost in shifts - static_assert((Msk >> nShift) == static_cast(-1)); // at correct position + if (nExt < nBitsLegacy) + nExt = (1 << nExt) - 1; + else + nExt = ((nExt - nBitsLegacy + 1) << nBitsLegacy) - 1; - nFlags |= static_cast(nExt) << nShift; + nFlags |= nExt << nShift; } -uint8_t LoginFlags::Extension::get(uint32_t nFlags) +uint32_t LoginFlags::Extension::get(uint32_t nFlags) { - static const uint32_t nShift = 4; - static_assert(((Msk >> nShift) << nShift) == Msk); // no bits are lost in shifts - static_assert((Msk >> nShift) == static_cast(-1)); // at correct position + uint32_t val = (Msk & nFlags) >> nShift; + + const uint32_t nLegacyVal = (1 << nBitsLegacy) - 1; + if (nLegacyVal == (val & nLegacyVal)) + return ((val - nLegacyVal) >> nBitsLegacy) + nBitsLegacy; + + // find 1st zero bit + uint32_t iBit = 0; + for (; iBit < nBitsLegacy - 1; iBit++) + if (!(1 & (val >> iBit))) + break; - return static_cast(nFlags >> nShift); + return iBit; } void NodeConnection::SendLogin() @@ -750,11 +759,11 @@ void NodeConnection::OnMsg(Login&& msg) void NodeConnection::OnLoginInternal(Login&& msg) { - uint8_t nExt = LoginFlags::Extension::get(msg.m_Flags); + uint32_t nExt = LoginFlags::Extension::get(msg.m_Flags); if (LoginFlags::Extension::Maximum != nExt) { bool bNewer = (nExt > LoginFlags::Extension::Maximum); - LOG_WARNING() << "Peer " << m_Connection->peer_address() << " uses " << (bNewer ? "newer" : "older") << " ext: " << static_cast(nExt); + LOG_WARNING() << "Peer " << m_Connection->peer_address() << " uses " << (bNewer ? "newer" : "older") << " ext: " << nExt; if (nExt < LoginFlags::Extension::Minimum) ThrowUnexpected("Legacy", NodeProcessingException::Type::Incompatible); diff --git a/core/proto.h b/core/proto.h index 9248951d9..ef9572ee6 100644 --- a/core/proto.h +++ b/core/proto.h @@ -325,20 +325,23 @@ namespace proto { struct Extension { - static const uint32_t Msk = 0xff0; + static const uint32_t nShift = 4; // 1st 4 bits are occupied by flags specified above + static const uint32_t nBitsLegacy = 4; // 1st 4 bits are set consequently for each new version + static const uint32_t nBitsExtra = 8; - // 1 - Supports Bbs with POW, more advanced proof/disproof scheme for SPV clients (?) - // 3 - Supports large HdrPack, BlockPack with parameters - // 7 - Supports Login1, Status (former Boolean) for NewTransaction result, compatible with Fork H1 - static const uint8_t Minimum = 7; + static const uint32_t Msk = ((1 << (nBitsLegacy + nBitsExtra)) - 1) << nShift; - // 15 - Supports proto::Events (replaces proto::EventsLegacy) - // 16 - Supports Events serif + // 1 - Supports Bbs with POW, more advanced proof/disproof scheme for SPV clients (?) + // 2 - Supports large HdrPack, BlockPack with parameters + // 3 - Supports Login1, Status (former Boolean) for NewTransaction result, compatible with Fork H1 + // 4 - Supports proto::Events (replaces proto::EventsLegacy) + // 5 - Supports Events serif - static const uint8_t Maximum = 16; + static const uint32_t Minimum = 3; + static const uint32_t Maximum = 5; - static void set(uint32_t& nFlags, uint8_t nExt); - static uint8_t get(uint32_t nFlags); + static void set(uint32_t& nFlags, uint32_t nExt); + static uint32_t get(uint32_t nFlags); }; }; diff --git a/core/unittest/ecc_test.cpp b/core/unittest/ecc_test.cpp index 6a8cfd142..eddc8f4c9 100644 --- a/core/unittest/ecc_test.cpp +++ b/core/unittest/ecc_test.cpp @@ -1620,6 +1620,30 @@ void TestDifficulty() } } +void TestProtoVer() +{ + using namespace beam; + + const uint32_t nMskFlags = ~proto::LoginFlags::Extension::Msk; + + for (uint32_t nVer = 0; nVer < 200; nVer++) + { + uint32_t nFlags = 0; + proto::LoginFlags::Extension::set(nFlags, nVer); + verify_test(!(nFlags & nMskFlags)); // should not leak + + uint32_t nVer2 = proto::LoginFlags::Extension::get(nFlags); + verify_test(nVer == nVer2); + + nFlags = nMskFlags; + proto::LoginFlags::Extension::set(nFlags, nVer); + verify_test((nFlags & nMskFlags) == nMskFlags); // should not loose flags + + nVer2 = proto::LoginFlags::Extension::get(nFlags); + verify_test(nVer == nVer2); + } +} + void TestRandom() { PseudoRandomGenerator::Scope scopePrg(nullptr); // restore std @@ -2114,6 +2138,7 @@ void TestAll() TestKdf(); TestBbs(); TestDifficulty(); + TestProtoVer(); TestRandom(); TestFourCC(); TestTreasury(); diff --git a/node/node.cpp b/node/node.cpp index a53a458b1..6c6c80cc6 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -2793,7 +2793,7 @@ void Node::Peer::MaybeSendSerif() if (!(Flags::Viewer & m_Flags) || (Flags::SerifSent & m_Flags)) return; - if (proto::LoginFlags::Extension::get(m_LoginFlags) < 16) + if (proto::LoginFlags::Extension::get(m_LoginFlags) < 5) return; proto::EventsSerif msg; @@ -3429,7 +3429,7 @@ void Node::Peer::OnMsg(proto::GetEvents&& msg) else LOG_WARNING() << "Peer " << m_RemoteAddr << " Unauthorized Utxo events request."; - if (proto::LoginFlags::Extension::get(m_LoginFlags) >= 15) + if (proto::LoginFlags::Extension::get(m_LoginFlags) >= 4) { Send(msgOut); } From 700ae48a8daa5e2de76a0191cb97f29123bdf6ee Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 9 Jun 2020 17:53:37 +0300 Subject: [PATCH 101/136] Wallet: fixed EventsSerif processing --- wallet/core/wallet.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/wallet/core/wallet.cpp b/wallet/core/wallet.cpp index 3ba39e263..574851ed4 100644 --- a/wallet/core/wallet.cpp +++ b/wallet/core/wallet.cpp @@ -1090,8 +1090,9 @@ namespace beam::wallet hh.m_Height = bWasFullySynced ? sTip.m_Height : MaxHeight; } - bool bMustRescan = (hh.m_Hash != hv); - if (bMustRescan) + bool bHashChanged = (hh.m_Hash != hv); + bool bMustRescan = bHashChanged; + if (bHashChanged) { // Node Serif has changed (either connected to different node, or it rescanned the blockchain). The events stream may not be consistent with ours. Height h0 = GetEventsHeightNext(); @@ -1105,6 +1106,14 @@ namespace beam::wallet bMustRescan = (h >= h0); } } + + hh.m_Hash = hv; + } + + if (bHashChanged || (h != hh.m_Height)) + { + hh.m_Height = h; + storage::setVar(*m_WalletDB, szEvtSerif, hh); } if (bMustRescan) From 8b97135f3879fca83360fe20aa53dc284603d330 Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 9 Jun 2020 23:04:33 +0300 Subject: [PATCH 102/136] node_net_sim: fast-sync for local node, auto-adjusting the "bullet" value according to fee settings --- node/utils/node_net_sim.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/node/utils/node_net_sim.cpp b/node/utils/node_net_sim.cpp index 7fd153a32..128eaa836 100644 --- a/node/utils/node_net_sim.cpp +++ b/node/utils/node_net_sim.cpp @@ -1027,6 +1027,7 @@ int main_Guarded(int argc, char* argv[]) node.m_Cfg.m_Dandelion.m_FluffProbability = 0xFFFF; node.m_Keys.SetSingleKey(pKdf); + node.m_Cfg.m_Horizon.SetStdFastSync(); node.Initialize(); if (!bLocalMode && !node.m_PostStartSynced) @@ -1055,8 +1056,8 @@ int main_Guarded(int argc, char* argv[]) else node.m_PostStartSynced = true; - if (ctx.m_Cfg.m_BulletValue < (ctx.m_Cfg.m_Fees.m_Kernel + ctx.m_Cfg.m_Fees.m_Output) * 2 + ctx.m_Cfg.m_Fees.m_ShieldedOutput + ctx.m_Cfg.m_Fees.m_ShieldedInput) - throw std::runtime_error("Bullet/Fee settings not consistent"); + Amount nMinInOut = (ctx.m_Cfg.m_Fees.m_Kernel + ctx.m_Cfg.m_Fees.m_Output) * 2 + ctx.m_Cfg.m_Fees.m_ShieldedOutput + ctx.m_Cfg.m_Fees.m_ShieldedInput; + std::setmax(ctx.m_Cfg.m_BulletValue, nMinInOut + 10); ctx.m_pKdf = pKdf; ctx.m_Network.m_Cfg.m_vNodes.push_back(io::Address(INADDR_LOOPBACK, g_LocalNodePort)); From eeba7f65c77a37ad95db7368c325e17aec61a61c Mon Sep 17 00:00:00 2001 From: valdok Date: Wed, 10 Jun 2020 09:23:30 +0300 Subject: [PATCH 103/136] Shielded/Output: option to hide beam asset --- core/shielded.cpp | 8 ++++---- core/shielded.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/shielded.cpp b/core/shielded.cpp index 889cbcd71..87d648eca 100644 --- a/core/shielded.cpp +++ b/core/shielded.cpp @@ -334,7 +334,7 @@ namespace beam set_kG(hvShared, kTmp); } - void ShieldedTxo::Data::OutputParams::Generate(ShieldedTxo& txo, const ECC::Hash::Value& hvShared, ECC::Oracle& oracle) + void ShieldedTxo::Data::OutputParams::Generate(ShieldedTxo& txo, const ECC::Hash::Value& hvShared, ECC::Oracle& oracle, bool bHideAssetAlways /* = false */) { ECC::Scalar::Native pExtra[2]; @@ -361,7 +361,7 @@ namespace beam cp.m_Blob.n = sizeof(p); ECC::Scalar::Native skSign = m_k; - if (m_AssetID) + if (m_AssetID || bHideAssetAlways) { ECC::Scalar::Native skGen; get_skGen(skGen, hvShared); @@ -448,9 +448,9 @@ namespace beam ///////////// // Params (both) - void ShieldedTxo::Data::Params::GenerateOutp(ShieldedTxo& txo, ECC::Oracle& oracle) + void ShieldedTxo::Data::Params::GenerateOutp(ShieldedTxo& txo, ECC::Oracle& oracle, bool bHideAssetAlways /* = false */) { - m_Output.Generate(txo, m_Ticket.m_SharedSecret, oracle); + m_Output.Generate(txo, m_Ticket.m_SharedSecret, oracle, bHideAssetAlways); } bool ShieldedTxo::Data::Params::Recover(const ShieldedTxo& txo, ECC::Oracle& oracle, const Viewer& v) { diff --git a/core/shielded.h b/core/shielded.h index 3618bf281..4ce658467 100644 --- a/core/shielded.h +++ b/core/shielded.h @@ -74,7 +74,7 @@ namespace beam ECC::Scalar::Native m_k; User m_User; - void Generate(ShieldedTxo&, const ECC::Hash::Value& hvShared, ECC::Oracle&); + void Generate(ShieldedTxo&, const ECC::Hash::Value& hvShared, ECC::Oracle&, bool bHideAssetAlways /* = false */); bool Recover(const ShieldedTxo&, const ECC::Hash::Value& hvShared, ECC::Oracle&); void Restore_kG(const ECC::Hash::Value& hvShared); // restores m_k, all other members must be set @@ -94,7 +94,7 @@ namespace beam TicketParams m_Ticket; OutputParams m_Output; - void GenerateOutp(ShieldedTxo&, ECC::Oracle&); + void GenerateOutp(ShieldedTxo&, ECC::Oracle&, bool bHideAssetAlways /* = false */); bool Recover(const ShieldedTxo&, ECC::Oracle&, const Viewer&); }; From 2c2653881c841967477f8bd7876e5ed2d014f01d Mon Sep 17 00:00:00 2001 From: valdok Date: Wed, 10 Jun 2020 09:24:13 +0300 Subject: [PATCH 104/136] node_net_sim: hiding beam-asset for shielded in/outs --- node/utils/node_net_sim.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node/utils/node_net_sim.cpp b/node/utils/node_net_sim.cpp index 128eaa836..b671c091e 100644 --- a/node/utils/node_net_sim.cpp +++ b/node/utils/node_net_sim.cpp @@ -735,7 +735,7 @@ struct Context ECC::GenRandom(nonce); sdp.m_Ticket.Generate(pKrn->m_Txo.m_Ticket, v, nonce); - sdp.GenerateOutp(pKrn->m_Txo, oracle); + sdp.GenerateOutp(pKrn->m_Txo, oracle, true); pKrn->MsgToID(); //ECC::Point::Native pt; @@ -859,7 +859,7 @@ struct Context { beam::Executor::Scope scope(m_Exec); - pKrn->Sign(p, 0); + pKrn->Sign(p, 0, true); }; pTx->m_vKernels.push_back(std::move(pKrn)); From b895c3389bb47923229ba418ee2cc5a7107e70d4 Mon Sep 17 00:00:00 2001 From: valdok Date: Wed, 10 Jun 2020 16:53:48 +0300 Subject: [PATCH 105/136] Wallet/EventsSerif : always rescan UTXO on the 1st time. Added logging --- wallet/core/wallet.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/wallet/core/wallet.cpp b/wallet/core/wallet.cpp index 574851ed4..7312968f5 100644 --- a/wallet/core/wallet.cpp +++ b/wallet/core/wallet.cpp @@ -1082,12 +1082,9 @@ namespace beam::wallet if (!storage::getVar(*m_WalletDB, szEvtSerif, hh)) { hh.m_Hash = Zero; - - Block::SystemState::Full sTip; - get_tip(sTip); - - bool bWasFullySynced = (sTip.m_Height + 1 == GetEventsHeightNext()); - hh.m_Height = bWasFullySynced ? sTip.m_Height : MaxHeight; + // If this is the 1st time we received the serif - we do NOT assume the wallet was synced ok. It can potentially be already out-of-sync. + // Hence once node and wallet are both upgraded from older version - there will always be initial rescan. + hh.m_Height = MaxHeight; } bool bHashChanged = (hh.m_Hash != hv); @@ -1112,6 +1109,8 @@ namespace beam::wallet if (bHashChanged || (h != hh.m_Height)) { + LOG_INFO() << "Events Serif changed: " << (bHashChanged ? "new Hash, " : "") << "Height=" << h << (bMustRescan ? ", Resyncing" : ""); + hh.m_Height = h; storage::setVar(*m_WalletDB, szEvtSerif, hh); } From 558e1a9005b7bc2bd5ac3418960724dfe21fa755 Mon Sep 17 00:00:00 2001 From: valdok Date: Wed, 10 Jun 2020 18:41:50 +0300 Subject: [PATCH 106/136] build fix --- core/shielded.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/shielded.h b/core/shielded.h index 4ce658467..e5d175ded 100644 --- a/core/shielded.h +++ b/core/shielded.h @@ -74,7 +74,7 @@ namespace beam ECC::Scalar::Native m_k; User m_User; - void Generate(ShieldedTxo&, const ECC::Hash::Value& hvShared, ECC::Oracle&, bool bHideAssetAlways /* = false */); + void Generate(ShieldedTxo&, const ECC::Hash::Value& hvShared, ECC::Oracle&, bool bHideAssetAlways = false); bool Recover(const ShieldedTxo&, const ECC::Hash::Value& hvShared, ECC::Oracle&); void Restore_kG(const ECC::Hash::Value& hvShared); // restores m_k, all other members must be set @@ -94,7 +94,7 @@ namespace beam TicketParams m_Ticket; OutputParams m_Output; - void GenerateOutp(ShieldedTxo&, ECC::Oracle&, bool bHideAssetAlways /* = false */); + void GenerateOutp(ShieldedTxo&, ECC::Oracle&, bool bHideAssetAlways = false); bool Recover(const ShieldedTxo&, ECC::Oracle&, const Viewer&); }; From 8c5ad1a9dd0be4a8b5e43389adb08a5e4f4bccb7 Mon Sep 17 00:00:00 2001 From: valdok Date: Thu, 11 Jun 2020 00:17:26 +0300 Subject: [PATCH 107/136] Node: OnTransactinFluff() returns status --- node/node.cpp | 12 ++++++------ node/node.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index 6c6c80cc6..f6dd4ca6c 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -2533,7 +2533,7 @@ Height Node::SampleDummySpentHeight() return h; } -bool Node::OnTransactionFluff(Transaction::Ptr&& ptxArg, const Peer* pPeer, TxPool::Stem::Element* pElem) +uint8_t Node::OnTransactionFluff(Transaction::Ptr&& ptxArg, const Peer* pPeer, TxPool::Stem::Element* pElem) { Transaction::Ptr ptx; ptx.swap(ptxArg); @@ -2549,7 +2549,7 @@ bool Node::OnTransactionFluff(Transaction::Ptr&& ptxArg, const Peer* pPeer, TxPo m_Dandelion.Delete(*pElem); if (!bValid) - return false; + return proto::TxStatus::InvalidContext; } else { @@ -2570,7 +2570,7 @@ bool Node::OnTransactionFluff(Transaction::Ptr&& ptxArg, const Peer* pPeer, TxPo TxPool::Fluff::TxSet::iterator it = m_TxPool.m_setTxs.find(key); if (m_TxPool.m_setTxs.end() != it) - return true; + return proto::TxStatus::Ok; const Transaction& tx = *ptx; @@ -2581,7 +2581,7 @@ bool Node::OnTransactionFluff(Transaction::Ptr&& ptxArg, const Peer* pPeer, TxPo LogTx(tx, nCode, key.m_Key); if (proto::TxStatus::Ok != nCode) { - return false; // stupid compiler insists on parentheses here! + return nCode; // stupid compiler insists on parentheses here! } TxPool::Fluff::Element* pNewTxElem = m_TxPool.AddValidTx(std::move(ptx), ctx, key.m_Key); @@ -2596,7 +2596,7 @@ bool Node::OnTransactionFluff(Transaction::Ptr&& ptxArg, const Peer* pPeer, TxPo } if (!pNewTxElem) - return false; + return nCode; // though the tx is dropped, we return status ok. proto::HaveTransaction msgOut; msgOut.m_ID = key.m_Key; @@ -2616,7 +2616,7 @@ bool Node::OnTransactionFluff(Transaction::Ptr&& ptxArg, const Peer* pPeer, TxPo if (m_Miner.IsEnabled() && !m_Miner.m_pTaskToFinalize) m_Miner.SetTimer(m_Cfg.m_Timeout.m_MiningSoftRestart_ms, false); - return true; + return nCode; } void Node::Dandelion::OnTimedOut(Element& x) diff --git a/node/node.h b/node/node.h index e3def9303..89a208670 100644 --- a/node/node.h +++ b/node/node.h @@ -352,6 +352,7 @@ struct Node } m_Dandelion; uint8_t OnTransactionStem(Transaction::Ptr&&, const Peer*); + uint8_t OnTransactionFluff(Transaction::Ptr&&, const Peer*, Dandelion::Element*); void OnTransactionAggregated(Dandelion::Element&); void PerformAggregation(Dandelion::Element&); void AddDummyInputs(Transaction&); @@ -359,7 +360,6 @@ struct Node bool AddDummyInputEx(Transaction& tx, const CoinID&); void AddDummyOutputs(Transaction&); Height SampleDummySpentHeight(); - bool OnTransactionFluff(Transaction::Ptr&&, const Peer*, Dandelion::Element*); uint8_t ValidateTx(Transaction::Context&, const Transaction&); // complete validation void LogTx(const Transaction&, uint8_t nStatus, const Transaction::KeyType&); From 5416b901f1429eb2481f5230b61f2e414de3bd48 Mon Sep 17 00:00:00 2001 From: valdok Date: Thu, 11 Jun 2020 01:17:00 +0300 Subject: [PATCH 108/136] Node: deferring NewTransaction processing (except when it comes from the wallet, and it expects reply) --- node/node.cpp | 82 ++++++++++++++++++++++++++++++++++++++++++++++----- node/node.h | 25 ++++++++++++++-- 2 files changed, 97 insertions(+), 10 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index f6dd4ca6c..35116e5a7 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -2054,15 +2054,81 @@ void Node::Peer::OnMsg(proto::NewTransaction&& msg) ThrowUnexpected(); // our deserialization permits NULL Ptrs. // However the transaction body must have already been checked for NULLs - if (msg.m_Fluff) - m_This.OnTransactionFluff(std::move(msg.m_Transaction), this, NULL); - else + // Change in protocol! + // Historically the node replied with proto::Status message for transactions in stem phase only, for fluff phase no reply was necessary. + // Now we reply regardless to phase, but ONLY to non-node client (means - FlyClient). + // For other cases the tx verification is deferred, until the node is idle. + bool bReply = !(Flags::PiRcvd & m_Flags); + + const PeerID* pSender = m_pInfo ? &m_pInfo->m_ID.m_Key : nullptr; + + if (bReply) { proto::Status msgOut; - msgOut.m_Value = m_This.OnTransactionStem(std::move(msg.m_Transaction), this); - + msgOut.m_Value = m_This.OnTransaction(std::move(msg.m_Transaction), pSender, msg.m_Fluff); Send(msgOut); } + else + { + m_This.OnTransactionDeferred(std::move(msg.m_Transaction), pSender, msg.m_Fluff); + } +} + +void Node::OnTransactionDeferred(Transaction::Ptr&& pTx, const PeerID* pSender, bool bFluff) +{ + TxDeferred::Element txd; + txd.m_pTx = std::move(pTx); + txd.m_Fluff = bFluff; + + if (pSender) + txd.m_Sender = *pSender; + else + txd.m_Sender = Zero; + + //if (m_Cfg.m_LogTxFluff) + //{ + // Transaction::KeyType key; + // txd.m_pTx->get_Key(key); + + // LOG_INFO() << "Tx " << key << " deferred"; + //} + + if (m_TxDeferred.m_lst.empty()) + m_TxDeferred.SetTimer(); + else + { + while (m_TxDeferred.m_lst.size() > m_Cfg.m_MaxDeferredTransactions) + m_TxDeferred.m_lst.pop_front(); + } + + m_TxDeferred.m_lst.push_back(std::move(txd)); +} + +void Node::TxDeferred::OnTimer() +{ + if (m_lst.empty()) + return; + + TxDeferred::Element& x = m_lst.front(); + get_ParentObj().OnTransaction(std::move(x.m_pTx), &x.m_Sender, x.m_Fluff); + + m_lst.pop_front(); + if (!m_lst.empty()) + SetTimer(); +} + +void Node::TxDeferred::SetTimer() +{ + if (!m_pTimer) + m_pTimer = io::Timer::create(io::Reactor::get_Current()); + m_pTimer->start(0, false, [this]() { OnTimer(); }); +} + +uint8_t Node::OnTransaction(Transaction::Ptr&& pTx, const PeerID* pSender, bool bFluff) +{ + return bFluff ? + OnTransactionFluff(std::move(pTx), pSender, nullptr) : + OnTransactionStem(std::move(pTx)); } uint8_t Node::ValidateTx(Transaction::Context& ctx, const Transaction& tx) @@ -2177,7 +2243,7 @@ uint32_t Node::RandomUInt32(uint32_t threshold) return threshold; } -uint8_t Node::OnTransactionStem(Transaction::Ptr&& ptx, const Peer* pPeer) +uint8_t Node::OnTransactionStem(Transaction::Ptr&& ptx) { TxStats s; ptx->get_Reader().AddStats(s); @@ -2533,7 +2599,7 @@ Height Node::SampleDummySpentHeight() return h; } -uint8_t Node::OnTransactionFluff(Transaction::Ptr&& ptxArg, const Peer* pPeer, TxPool::Stem::Element* pElem) +uint8_t Node::OnTransactionFluff(Transaction::Ptr&& ptxArg, const PeerID* pSender, TxPool::Stem::Element* pElem) { Transaction::Ptr ptx; ptx.swap(ptxArg); @@ -2604,7 +2670,7 @@ uint8_t Node::OnTransactionFluff(Transaction::Ptr&& ptxArg, const Peer* pPeer, T for (PeerList::iterator it2 = m_lstPeers.begin(); m_lstPeers.end() != it2; it2++) { Peer& peer = *it2; - if (&peer == pPeer) + if (pSender && peer.m_pInfo && (peer.m_pInfo->m_ID.m_Key == *pSender)) continue; if (!(peer.m_LoginFlags & proto::LoginFlags::SpreadingTransactions) || peer.IsChocking()) continue; diff --git a/node/node.h b/node/node.h index 89a208670..6b52d43c8 100644 --- a/node/node.h +++ b/node/node.h @@ -72,6 +72,7 @@ struct Node uint32_t m_MaxConcurrentBlocksRequest = 18; uint32_t m_MaxPoolTransactions = 100 * 1000; + uint32_t m_MaxDeferredTransactions = 100 * 1000; uint32_t m_MiningThreads = 0; // by default disabled bool m_LogEvents = false; // may be insecure. Off by default. @@ -351,8 +352,28 @@ struct Node IMPLEMENT_GET_PARENT_OBJ(Node, m_Dandelion) } m_Dandelion; - uint8_t OnTransactionStem(Transaction::Ptr&&, const Peer*); - uint8_t OnTransactionFluff(Transaction::Ptr&&, const Peer*, Dandelion::Element*); + struct TxDeferred + { + struct Element + { + Transaction::Ptr m_pTx; + PeerID m_Sender; + bool m_Fluff; + }; + + std::list m_lst; + io::Timer::Ptr m_pTimer; + + void SetTimer(); + void OnTimer(); + + IMPLEMENT_GET_PARENT_OBJ(Node, m_TxDeferred) + } m_TxDeferred; + + uint8_t OnTransaction(Transaction::Ptr&&, const PeerID*, bool bFluff); + void OnTransactionDeferred(Transaction::Ptr&&, const PeerID*, bool bFluff); + uint8_t OnTransactionStem(Transaction::Ptr&&); + uint8_t OnTransactionFluff(Transaction::Ptr&&, const PeerID*, Dandelion::Element*); void OnTransactionAggregated(Dandelion::Element&); void PerformAggregation(Dandelion::Element&); void AddDummyInputs(Transaction&); From 6a994b3805fe348637fd0f274d64e19e9766a720 Mon Sep 17 00:00:00 2001 From: valdok Date: Thu, 11 Jun 2020 01:19:20 +0300 Subject: [PATCH 109/136] explorer_node: using maximum threads --- explorer/explorer_node.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer/explorer_node.cpp b/explorer/explorer_node.cpp index a14089161..fae3ed666 100644 --- a/explorer/explorer_node.cpp +++ b/explorer/explorer_node.cpp @@ -201,7 +201,7 @@ void setup_node(Node& node, const Options& o) { node.m_Cfg.m_Listen.port(o.nodeListenTo.port()); node.m_Cfg.m_Listen.ip(o.nodeListenTo.ip()); node.m_Cfg.m_MiningThreads = 0; - node.m_Cfg.m_VerificationThreads = 1; + node.m_Cfg.m_VerificationThreads = -1; node.m_Keys.m_pOwner = o.ownerKey; From be116ee41e8e0797cd9470f3e72b6ffeafd9c37f Mon Sep 17 00:00:00 2001 From: valdok Date: Thu, 11 Jun 2020 18:02:07 +0300 Subject: [PATCH 110/136] uv: added idle processing wrapper --- utility/io/timer.cpp | 29 +++++++++++++++++++++++++++++ utility/io/timer.h | 23 +++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/utility/io/timer.cpp b/utility/io/timer.cpp index 3114751e9..9f60fd771 100644 --- a/utility/io/timer.cpp +++ b/utility/io/timer.cpp @@ -61,5 +61,34 @@ void Timer::cancel() { _callback = []{}; } + + + +void IdleEvt::cancel() +{ + if (m_Set) + { + m_Set = false; + uv_idle_stop(&m_Handle); + } +} + +void IdleEvt::start() +{ + if (!m_Set) + { + m_Set = true; + uv_idle_init(&Reactor::get_Current().get_UvLoop(), &m_Handle); + uv_idle_start(&m_Handle, Handle::CallbackRaw); + } +} + +void IdleEvt::Handle::CallbackRaw(uv_idle_t* p) +{ + static_cast(p)->get_ParentObj().OnSchedule(); +} + + + }} //namespaces diff --git a/utility/io/timer.h b/utility/io/timer.h index 590a89371..2691a629b 100644 --- a/utility/io/timer.h +++ b/utility/io/timer.h @@ -14,6 +14,7 @@ #pragma once #include "reactor.h" +#include "../common.h" // IMPLEMENT_GET_PARENT_OBJ namespace beam { namespace io { @@ -40,5 +41,27 @@ class Timer : protected Reactor::Object { Callback _callback; }; +struct IdleEvt +{ + ~IdleEvt() { cancel(); } + + void start(); + void cancel(); + + virtual void OnSchedule() {} + +private: + + struct Handle + :public uv_idle_t + { + static void CallbackRaw(uv_idle_t*); + + IMPLEMENT_GET_PARENT_OBJ(IdleEvt, m_Handle) + } m_Handle; + + bool m_Set = false; +}; + }} //namespaces From 7acbf7f90157d3988d0245bdf108284e2ffbbb38 Mon Sep 17 00:00:00 2001 From: valdok Date: Thu, 11 Jun 2020 18:04:43 +0300 Subject: [PATCH 111/136] Node/TxDeferred processing: replacing 0-timer by idle processor --- node/node.cpp | 26 ++++++++++---------------- node/node.h | 5 ++--- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index 35116e5a7..a708923fa 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -2094,7 +2094,7 @@ void Node::OnTransactionDeferred(Transaction::Ptr&& pTx, const PeerID* pSender, //} if (m_TxDeferred.m_lst.empty()) - m_TxDeferred.SetTimer(); + m_TxDeferred.start(); else { while (m_TxDeferred.m_lst.size() > m_Cfg.m_MaxDeferredTransactions) @@ -2104,24 +2104,18 @@ void Node::OnTransactionDeferred(Transaction::Ptr&& pTx, const PeerID* pSender, m_TxDeferred.m_lst.push_back(std::move(txd)); } -void Node::TxDeferred::OnTimer() +void Node::TxDeferred::OnSchedule() { - if (m_lst.empty()) - return; - - TxDeferred::Element& x = m_lst.front(); - get_ParentObj().OnTransaction(std::move(x.m_pTx), &x.m_Sender, x.m_Fluff); - - m_lst.pop_front(); if (!m_lst.empty()) - SetTimer(); -} + { + TxDeferred::Element& x = m_lst.front(); + get_ParentObj().OnTransaction(std::move(x.m_pTx), &x.m_Sender, x.m_Fluff); + m_lst.pop_front(); + } + + if (m_lst.empty()) + cancel(); -void Node::TxDeferred::SetTimer() -{ - if (!m_pTimer) - m_pTimer = io::Timer::create(io::Reactor::get_Current()); - m_pTimer->start(0, false, [this]() { OnTimer(); }); } uint8_t Node::OnTransaction(Transaction::Ptr&& pTx, const PeerID* pSender, bool bFluff) diff --git a/node/node.h b/node/node.h index 6b52d43c8..c2cc09459 100644 --- a/node/node.h +++ b/node/node.h @@ -353,6 +353,7 @@ struct Node } m_Dandelion; struct TxDeferred + :public io::IdleEvt { struct Element { @@ -362,10 +363,8 @@ struct Node }; std::list m_lst; - io::Timer::Ptr m_pTimer; - void SetTimer(); - void OnTimer(); + virtual void OnSchedule() override; IMPLEMENT_GET_PARENT_OBJ(Node, m_TxDeferred) } m_TxDeferred; From 90ac94b5b650614218774c2fefc47a048b5a54f6 Mon Sep 17 00:00:00 2001 From: valdok Date: Thu, 11 Jun 2020 22:49:42 +0300 Subject: [PATCH 112/136] WalletDB::visitShieldedCoins() - order by indexed field --- wallet/core/wallet_db.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/core/wallet_db.cpp b/wallet/core/wallet_db.cpp index 3051ba7c2..64e81b71a 100644 --- a/wallet/core/wallet_db.cpp +++ b/wallet/core/wallet_db.cpp @@ -2589,7 +2589,7 @@ namespace beam::wallet void WalletDB::visitShieldedCoins(std::function func) { - sqlite::Statement stm(this, "SELECT " SHIELDED_COIN_FIELDS " FROM " SHIELDED_COINS_NAME " ORDER BY ID;"); + sqlite::Statement stm(this, "SELECT " SHIELDED_COIN_FIELDS " FROM " SHIELDED_COINS_NAME " ORDER BY Key;"); // the order is not importantt, but at least it should be by indexed field while (stm.step()) { ShieldedCoin coin; From 24ea4d80e6fb4eaca21db6bd8be68c2b167caac9 Mon Sep 17 00:00:00 2001 From: valdok Date: Thu, 11 Jun 2020 23:04:12 +0300 Subject: [PATCH 113/136] WalletClient: async handling of onCoinsChanged() --- wallet/client/wallet_client.cpp | 10 +++++++--- wallet/client/wallet_client.h | 7 +++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/wallet/client/wallet_client.cpp b/wallet/client/wallet_client.cpp index ab8ec88e6..22f29c33b 100644 --- a/wallet/client/wallet_client.cpp +++ b/wallet/client/wallet_client.cpp @@ -503,9 +503,13 @@ namespace beam::wallet void WalletClient::onCoinsChanged(ChangeAction action, const std::vector& items) { m_CoinChangesCollector.CollectItems(action, items); - // TODO: refactor this - // We should call getStatus to update balances - onStatus(getStatus()); + m_DeferredBalanceUpdate.start(); + } + + void WalletClient::DeferredBalanceUpdate::OnSchedule() + { + cancel(); + get_ParentObj().onStatus(get_ParentObj().getStatus()); } void WalletClient::onTransactionChanged(ChangeAction action, const std::vector& items) diff --git a/wallet/client/wallet_client.h b/wallet/client/wallet_client.h index 9e73834dd..f6f7ed659 100644 --- a/wallet/client/wallet_client.h +++ b/wallet/client/wallet_client.h @@ -101,6 +101,13 @@ namespace beam::wallet // use this function to post function call to client's main loop void postFunctionToClientContext(MessageFunction&& func); + struct DeferredBalanceUpdate + :public io::IdleEvt + { + virtual void OnSchedule() override; + IMPLEMENT_GET_PARENT_OBJ(WalletClient, m_DeferredBalanceUpdate) + } m_DeferredBalanceUpdate; + // Callbacks virtual void onStatus(const WalletStatus& status) {} virtual void onTxStatus(ChangeAction, const std::vector& items) {} From e0c8ed9d4eaa404f4bf4c9bef1f99f9e2f8b18e2 Mon Sep 17 00:00:00 2001 From: valdok Date: Fri, 12 Jun 2020 19:47:49 +0300 Subject: [PATCH 114/136] proto::Events: max events increased to 1024 --- core/fly_client.cpp | 4 ++++ core/fly_client.h | 15 ++++++++++++++- core/proto.h | 5 +++-- node/node.cpp | 3 +++ node/utils/node_net_sim.cpp | 2 +- wallet/core/wallet.cpp | 2 +- 6 files changed, 26 insertions(+), 5 deletions(-) diff --git a/core/fly_client.cpp b/core/fly_client.cpp index 729b49073..643984f7d 100644 --- a/core/fly_client.cpp +++ b/core/fly_client.cpp @@ -756,6 +756,10 @@ bool FlyClient::NetworkStd::Connection::IsSupported(RequestEvents& req) void FlyClient::NetworkStd::Connection::OnRequestData(RequestEvents& req) { + req.m_Max = (LoginFlags::Extension::get(m_LoginFlags) >= 5) ? + proto::Event::s_Max : + proto::Event::s_Max0; + } bool FlyClient::NetworkStd::Connection::IsSupported(RequestTransaction& req) diff --git a/core/fly_client.h b/core/fly_client.h index 19d1a9ad2..1a1cbda2d 100644 --- a/core/fly_client.h +++ b/core/fly_client.h @@ -22,6 +22,16 @@ namespace beam { namespace proto { + namespace details { + + template struct ExtraData { + }; + + template <> struct ExtraData { + uint32_t m_Max = proto::Event::s_Max; + }; + } + struct FlyClient { #define REQUEST_TYPES_All(macro) \ @@ -67,7 +77,10 @@ namespace proto { }; #define THE_MACRO(type, msgOut, msgIn) \ - struct Request##type :public Request { \ + struct Request##type \ + :public Request \ + ,public details::ExtraData \ + { \ typedef boost::intrusive_ptr Ptr; \ Request##type() :m_Msg(Zero), m_Res(Zero) {} \ virtual ~Request##type() {} \ diff --git a/core/proto.h b/core/proto.h index ef9572ee6..b269f443b 100644 --- a/core/proto.h +++ b/core/proto.h @@ -335,7 +335,7 @@ namespace proto { // 2 - Supports large HdrPack, BlockPack with parameters // 3 - Supports Login1, Status (former Boolean) for NewTransaction result, compatible with Fork H1 // 4 - Supports proto::Events (replaces proto::EventsLegacy) - // 5 - Supports Events serif + // 5 - Supports Events serif, max num of events per message increased from 64 to 1024 static const uint32_t Minimum = 3; static const uint32_t Maximum = 5; @@ -356,7 +356,8 @@ namespace proto { struct Event { - static const uint32_t s_Max = 64; // will send more, if the remaining events are on the same height + static const uint32_t s_Max0 = 64; + static const uint32_t s_Max = 1024; // will send more, if the remaining events are on the same height #define BeamEventsAll(macro) \ macro(1, Utxo) \ diff --git a/node/node.cpp b/node/node.cpp index a708923fa..65dd2f99e 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -3468,6 +3468,9 @@ void Node::Peer::OnMsg(proto::GetEvents&& msg) Height hLast = 0; uint32_t nCount = 0; + // we'll send up to s_Max num of events, even to older clients, they won't complain + static_assert(proto::Event::s_Max > proto::Event::s_Max0); + Serializer ser; for (db.EnumEvents(wlk, msg.m_HeightMin); wlk.MoveNext(); hLast = wlk.m_Height) diff --git a/node/utils/node_net_sim.cpp b/node/utils/node_net_sim.cpp index b671c091e..7078436e1 100644 --- a/node/utils/node_net_sim.cpp +++ b/node/utils/node_net_sim.cpp @@ -339,7 +339,7 @@ struct Context Height hTip = get_ParentObj().m_FlyClient.get_Height(); - if (nCount < proto::Event::s_Max) + if (nCount < r.m_Max) m_hEvents = hTip + 1; else { diff --git a/wallet/core/wallet.cpp b/wallet/core/wallet.cpp index 7312968f5..b819ac645 100644 --- a/wallet/core/wallet.cpp +++ b/wallet/core/wallet.cpp @@ -921,7 +921,7 @@ namespace beam::wallet uint32_t nCount = p.Proceed(r.m_Res.m_Events); - if (nCount < proto::Event::s_Max) + if (nCount < r.m_Max) { Block::SystemState::Full sTip; m_WalletDB->get_History().get_Tip(sTip); From f10ddfbef3dfb840dd4bdd9d9e22562af2086d10 Mon Sep 17 00:00:00 2001 From: valdok Date: Fri, 12 Jun 2020 19:48:07 +0300 Subject: [PATCH 115/136] node_net_sim: printing shielded pool stats --- node/utils/node_net_sim.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/node/utils/node_net_sim.cpp b/node/utils/node_net_sim.cpp index 7078436e1..8a586d177 100644 --- a/node/utils/node_net_sim.cpp +++ b/node/utils/node_net_sim.cpp @@ -532,6 +532,8 @@ struct Context if (h < Rules::get().pForks[2].m_Height) return; + std::cout << "\tTotal shielded in/outs: " << (m_pProc->m_Mmr.m_Shielded.m_Count - m_pProc->m_Extra.m_ShieldedOutputs) << " / " << m_pProc->m_Extra.m_ShieldedOutputs << std::endl; + m_TxosMW.HandleTxs(m_setSplit, h); uint32_t nDone = m_TxosMW.HandleTxs(m_setTxsOut, h); From 4c7f0b94c892cebdd98cb15064bc31b4a8b948e3 Mon Sep 17 00:00:00 2001 From: valdok Date: Sat, 13 Jun 2020 08:04:53 +0300 Subject: [PATCH 116/136] Node: added MaxAutoRollback parameter. Set to 60 --- node/node.cpp | 7 +++++++ node/node.h | 4 ++++ node/processor.cpp | 9 +++++++-- node/processor.h | 3 ++- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index 65dd2f99e..7bd6cf483 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -779,6 +779,13 @@ void Node::Processor::get_ViewerKeys(ViewerKeys& vk) vk.m_pSh = &get_ParentObj().m_Keys.m_vSh.front(); } +Height Node::Processor::get_MaxAutoRollback() +{ + return std::min( + NodeProcessor::get_MaxAutoRollback(), + get_ParentObj().m_Cfg.m_MaxAutoRollback); +} + void Node::Processor::OnEvent(Height h, const proto::Event::Base& evt) { if (get_ParentObj().m_Cfg.m_LogEvents) diff --git a/node/node.h b/node/node.h index c2cc09459..d8c248ae1 100644 --- a/node/node.h +++ b/node/node.h @@ -84,6 +84,9 @@ struct Node // negative: number of cores minus number of mining threads. int m_VerificationThreads = 0; + Height m_MaxAutoRollback = 60; // artificial restriction on how much the node will rollback automatically + // in either case it's no more than Rules::MaxRollback + struct Bbs { uint32_t m_MessageTimeout_s = 3600 * 12; // 1/2 day @@ -216,6 +219,7 @@ struct Node void OnEvent(Height, const proto::Event::Base&) override; void OnDummy(const CoinID&, Height) override; void InitializeUtxosProgress(uint64_t done, uint64_t total) override; + Height get_MaxAutoRollback() override; void Stop(); struct MyExecutorMT diff --git a/node/processor.cpp b/node/processor.cpp index bd8201720..629440ea3 100644 --- a/node/processor.cpp +++ b/node/processor.cpp @@ -693,12 +693,17 @@ const uint64_t* NodeProcessor::get_CachedRows(const NodeDB::StateID& sid, Height return nullptr; } -Height NodeProcessor::get_LowestReturnHeight() const +Height NodeProcessor::get_MaxAutoRollback() +{ + return Rules::get().MaxRollback; +} + +Height NodeProcessor::get_LowestReturnHeight() { Height hRet = m_Extra.m_TxoHi; Height h0 = IsFastSync() ? m_SyncData.m_h0 : m_Cursor.m_ID.m_Height; - Height hMaxRollback = Rules::get().MaxRollback; + Height hMaxRollback = get_MaxAutoRollback(); if (h0 > hMaxRollback) { diff --git a/node/processor.h b/node/processor.h index 47bf2e1c4..7e6a2d731 100644 --- a/node/processor.h +++ b/node/processor.h @@ -316,7 +316,7 @@ class NodeProcessor void OnFastSyncOver(MultiblockContext&, bool& bContextFail); // Lowest height to which it's possible to rollback. - Height get_LowestReturnHeight() const; + Height get_LowestReturnHeight(); static bool IsRemoteTipNeeded(const Block::SystemState::Full& sTipRemote, const Block::SystemState::Full& sTipMy); @@ -327,6 +327,7 @@ class NodeProcessor virtual void OnModified() {} virtual void InitializeUtxosProgress(uint64_t done, uint64_t total) {} virtual void OnFastSyncSucceeded() {} + virtual Height get_MaxAutoRollback(); struct MyExecutor :public Executor From dc17f5babf76f73ed1d1adf893442a3d682ce482 Mon Sep 17 00:00:00 2001 From: valdok Date: Sat, 13 Jun 2020 09:22:59 +0300 Subject: [PATCH 117/136] NodeProcessor: added ManualRollbackTo() and ForbidActiveAt() --- node/db.h | 1 + node/processor.cpp | 76 ++++++++++++++++++++++++++++++++++++ node/processor.h | 6 +++ node/unittests/node_test.cpp | 5 +++ 4 files changed, 88 insertions(+) diff --git a/node/db.h b/node/db.h index ea89614f1..e102175b6 100644 --- a/node/db.h +++ b/node/db.h @@ -60,6 +60,7 @@ class NodeDB AssetsCount, // Including unused. The last element is guaranteed to be used. AssetsCountUsed, // num of 'live' assets EventsSerif, // pseudo-random, reset each time the events are rescanned. + ForbiddenState, }; }; diff --git a/node/processor.cpp b/node/processor.cpp index 629440ea3..3823bad41 100644 --- a/node/processor.cpp +++ b/node/processor.cpp @@ -177,6 +177,13 @@ void NodeProcessor::Initialize(const char* szPath, const StartParams& sp) if (sp.m_Vacuum) Vacuum(); + blob.p = &m_sidForbidden; + blob.n = sizeof(m_sidForbidden); + if (m_DB.ParamGet(NodeDB::ParamID::ForbiddenState, nullptr, &blob)) + LogForbiddenState(); + else + ZeroObject(m_sidForbidden); + TryGoUp(); } @@ -275,6 +282,11 @@ void NodeProcessor::LogSyncData() LOG_INFO() << "Fast-sync mode up to height " << m_SyncData.m_Target.m_Height; } +void NodeProcessor::LogForbiddenState() +{ + LOG_INFO() << "Forbidden state: " << m_sidForbidden; +} + void NodeProcessor::SaveSyncData() { if (IsFastSync()) @@ -3684,6 +3696,70 @@ void NodeProcessor::RollbackTo(Height h) OnRolledBack(); } +bool NodeProcessor::ForbidActiveAt(Height h) +{ + if (h >= Rules::HeightGenesis) + { + if (m_Cursor.m_Sid.m_Height < h) + { + LOG_WARNING() << "Can't forbid a state above cursor"; + return false; + } + + NodeDB::StateID sid; + sid.m_Height = h; + sid.m_Row = FindActiveAtStrict(sid.m_Height); + m_DB.get_StateID(sid, m_sidForbidden); + + Blob blob(&m_sidForbidden, sizeof(m_sidForbidden)); + m_DB.ParamSet(NodeDB::ParamID::ForbiddenState, nullptr, &blob); + LogForbiddenState(); + } + else + { + LOG_INFO() << "Forbidden state reset"; + m_DB.ParamSet(NodeDB::ParamID::ForbiddenState, nullptr, nullptr); + } + + return true; +} + +void NodeProcessor::ManualRollbackTo(Height h) +{ + LOG_INFO() << "Manual rollback to " << h << "..."; + + bool bChanged = false; + + if (IsFastSync() && (m_SyncData.m_Target.m_Height > h)) + { + LOG_INFO() << "Fast-sync abort..."; + + RollbackTo(m_SyncData.m_h0); + DeleteBlocksInRange(m_SyncData.m_Target, m_SyncData.m_h0); + + ZeroObject(m_SyncData); + SaveSyncData(); + + bChanged = true; + } + + if (h < m_Extra.m_TxoHi) + { + LOG_INFO() << "Can't go below Height " << m_Extra.m_TxoHi; + h = m_Extra.m_TxoHi; + } + + if (m_Cursor.m_ID.m_Height > h) + { + ForbidActiveAt(h + 1); + RollbackTo(h); + bChanged = true; + } + + if (bChanged) + OnNewState(); +} + NodeProcessor::DataStatus::Enum NodeProcessor::OnStateInternal(const Block::SystemState::Full& s, Block::SystemState::ID& id, bool bAlreadyChecked) { s.get_ID(id); diff --git a/node/processor.h b/node/processor.h index 7e6a2d731..f80b629e6 100644 --- a/node/processor.h +++ b/node/processor.h @@ -181,6 +181,9 @@ class NodeProcessor NodeProcessor(); virtual ~NodeProcessor(); + bool ForbidActiveAt(Height); + void ManualRollbackTo(Height); + struct Horizon { // branches behind this are pruned @@ -237,6 +240,9 @@ class NodeProcessor } m_SyncData; + Block::SystemState::ID m_sidForbidden; + void LogForbiddenState(); + bool IsFastSync() const { return m_SyncData.m_Target.m_Row != 0; } void SaveSyncData(); diff --git a/node/unittests/node_test.cpp b/node/unittests/node_test.cpp index d688d227c..21b83095c 100644 --- a/node/unittests/node_test.cpp +++ b/node/unittests/node_test.cpp @@ -2649,6 +2649,11 @@ namespace beam auto logger = beam::Logger::create(LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG); node.PrintTxos(); + + NodeProcessor& proc = node.get_Processor(); + proc.ManualRollbackTo(3); + verify_test(proc.m_Cursor.m_ID.m_Height >= 3); // it won't necessarily reach 3 + verify_test(proc.m_sidForbidden.m_Height > Rules::HeightGenesis); // some rollback with forbidden state update must take place } From 4e8d7c4081458fc816a1fba403d7622a27c04886 Mon Sep 17 00:00:00 2001 From: valdok Date: Sat, 13 Jun 2020 09:59:28 +0300 Subject: [PATCH 118/136] NodeProcessor: fixed multi-block processing logic, where some blocks were already verified in the past (and then reverted due to reorgs) --- node/processor.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/node/processor.cpp b/node/processor.cpp index 3823bad41..022bbd0bc 100644 --- a/node/processor.cpp +++ b/node/processor.cpp @@ -1269,8 +1269,10 @@ struct NodeProcessor::MultiblockContext nTasks = ex.Flush(nTasks - 1); } - m_InProgress.m_Max++; - assert(m_InProgress.m_Max == pShared->m_Ctx.m_Height.m_Min); + // The following won't hold if some blocks in the current range were already verified in the past, and omitted from the current verification + // m_InProgress.m_Max++; + // assert(m_InProgress.m_Max == pShared->m_Ctx.m_Height.m_Min); + m_InProgress.m_Max = pShared->m_Ctx.m_Height.m_Min; bool bFull = (pShared->m_Ctx.m_Height.m_Min > m_This.m_SyncData.m_Target.m_Height); From a26504c27f6f8e0e170782ec3533fc146df4542a Mon Sep 17 00:00:00 2001 From: valdok Date: Sat, 13 Jun 2020 10:06:51 +0300 Subject: [PATCH 119/136] NodeProcessor: making sure forbidden state isn't handled/requested --- node/processor.cpp | 44 ++++++++++++++++++++++++++++++++------------ node/processor.h | 1 + 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/node/processor.cpp b/node/processor.cpp index 022bbd0bc..4acb3a795 100644 --- a/node/processor.cpp +++ b/node/processor.cpp @@ -177,12 +177,11 @@ void NodeProcessor::Initialize(const char* szPath, const StartParams& sp) if (sp.m_Vacuum) Vacuum(); - blob.p = &m_sidForbidden; - blob.n = sizeof(m_sidForbidden); - if (m_DB.ParamGet(NodeDB::ParamID::ForbiddenState, nullptr, &blob)) + blob = m_sidForbidden.m_Hash; + if (m_DB.ParamGet(NodeDB::ParamID::ForbiddenState, &m_sidForbidden.m_Height, &blob)) LogForbiddenState(); else - ZeroObject(m_sidForbidden); + ResetForbiddenStateVar(); TryGoUp(); } @@ -287,6 +286,12 @@ void NodeProcessor::LogForbiddenState() LOG_INFO() << "Forbidden state: " << m_sidForbidden; } +void NodeProcessor::ResetForbiddenStateVar() +{ + m_sidForbidden.m_Height = MaxHeight; // don't set it to 0, it may interfer with treasury in RequestData() + m_sidForbidden.m_Hash = Zero; +} + void NodeProcessor::SaveSyncData() { if (IsFastSync()) @@ -728,14 +733,17 @@ Height NodeProcessor::get_LowestReturnHeight() void NodeProcessor::RequestDataInternal(const Block::SystemState::ID& id, uint64_t row, bool bBlock, const NodeDB::StateID& sidTrg) { - if (id.m_Height >= get_LowestReturnHeight()) - { - RequestData(id, bBlock, sidTrg); + if (id.m_Height < get_LowestReturnHeight()) { + LOG_WARNING() << id << " State unreachable"; // probably will pollute the log, but it's a critical situation anyway + return; } - else - { - LOG_WARNING() << id << " State unreachable!"; // probably will pollute the log, but it's a critical situation anyway + + if (id == m_sidForbidden) { + LOG_WARNING() << id << " State forbidden"; + return; } + + RequestData(id, bBlock, sidTrg); } struct NodeProcessor::MultiSigmaContext @@ -2141,6 +2149,17 @@ struct NodeProcessor::KrnFlyMmr bool NodeProcessor::HandleBlock(const NodeDB::StateID& sid, const Block::SystemState::Full& s, MultiblockContext& mbc) { + if (s.m_Height == m_sidForbidden.m_Height) + { + Merkle::Hash hv; + s.get_Hash(hv); + if (hv == m_sidForbidden.m_Hash) + { + LOG_WARNING() << LogSid(m_DB, sid) << " Forbidden"; + return false; + } + } + ByteBuffer bbP, bbE; m_DB.GetStateBlock(sid.m_Row, &bbP, &bbE, nullptr); @@ -3713,14 +3732,15 @@ bool NodeProcessor::ForbidActiveAt(Height h) sid.m_Row = FindActiveAtStrict(sid.m_Height); m_DB.get_StateID(sid, m_sidForbidden); - Blob blob(&m_sidForbidden, sizeof(m_sidForbidden)); - m_DB.ParamSet(NodeDB::ParamID::ForbiddenState, nullptr, &blob); + Blob blob = m_sidForbidden.m_Hash; + m_DB.ParamSet(NodeDB::ParamID::ForbiddenState, &m_sidForbidden.m_Height, &blob); LogForbiddenState(); } else { LOG_INFO() << "Forbidden state reset"; m_DB.ParamSet(NodeDB::ParamID::ForbiddenState, nullptr, nullptr); + ResetForbiddenStateVar(); } return true; diff --git a/node/processor.h b/node/processor.h index f80b629e6..fdba91cee 100644 --- a/node/processor.h +++ b/node/processor.h @@ -242,6 +242,7 @@ class NodeProcessor Block::SystemState::ID m_sidForbidden; void LogForbiddenState(); + void ResetForbiddenStateVar(); bool IsFastSync() const { return m_SyncData.m_Target.m_Row != 0; } From a748e1e7a64d6a7bd8be4380338bdf170d6c4c72 Mon Sep 17 00:00:00 2001 From: valdok Date: Sat, 13 Jun 2020 11:05:43 +0300 Subject: [PATCH 120/136] NodeProcessor: adjusted manual rollback max depth w.r.t. fossil height --- node/processor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/processor.cpp b/node/processor.cpp index 4acb3a795..287453d3b 100644 --- a/node/processor.cpp +++ b/node/processor.cpp @@ -717,7 +717,7 @@ Height NodeProcessor::get_MaxAutoRollback() Height NodeProcessor::get_LowestReturnHeight() { - Height hRet = m_Extra.m_TxoHi; + Height hRet = std::max(m_Extra.m_TxoHi, m_Extra.m_Fossil); Height h0 = IsFastSync() ? m_SyncData.m_h0 : m_Cursor.m_ID.m_Height; Height hMaxRollback = get_MaxAutoRollback(); From 64893938062985504bf36933807e688e54310ba5 Mon Sep 17 00:00:00 2001 From: valdok Date: Sat, 13 Jun 2020 11:06:09 +0300 Subject: [PATCH 121/136] Node: adde --manual_rollback option --- beam/cli.cpp | 11 +++++++++++ node/node.h | 4 ++-- utility/cli/options.cpp | 2 ++ utility/cli/options.h | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/beam/cli.cpp b/beam/cli.cpp index 43ec83864..fc6c11a0d 100644 --- a/beam/cli.cpp +++ b/beam/cli.cpp @@ -383,6 +383,17 @@ int main_impl(int argc, char* argv[]) }); } + if (vm.count(cli::MANUAL_ROLLBACK)) + { + Height h = vm[cli::MANUAL_ROLLBACK].as(); + if (h >= Rules::HeightGenesis) + node.get_Processor().ManualRollbackTo(h); + else + node.get_Processor().ForbidActiveAt(0); + + node.RefreshCongestions(); + } + reactor->run(); } } diff --git a/node/node.h b/node/node.h index d8c248ae1..3e2a587ff 100644 --- a/node/node.h +++ b/node/node.h @@ -201,6 +201,8 @@ struct Node bool GenerateRecoveryInfo(const char*); void PrintTxos(); + void RefreshCongestions(); // call explicitly if manual rollback or forbidden state is modified + bool DecodeAndCheckHdrs(std::vector&, const proto::HdrPack&); private: @@ -607,8 +609,6 @@ struct Node Peer* AllocPeer(const beam::io::Address&); - void RefreshCongestions(); - struct Server :public proto::NodeConnection::Server { diff --git a/utility/cli/options.cpp b/utility/cli/options.cpp index b1b111a4a..f19d6151f 100644 --- a/utility/cli/options.cpp +++ b/utility/cli/options.cpp @@ -165,6 +165,7 @@ namespace beam const char* RESET_ID = "reset_id"; const char* ERASE_ID = "erase_id"; const char* PRINT_TXO = "print_txo"; + const char* MANUAL_ROLLBACK = "manual_rollback"; const char* CHECKDB = "check_db"; const char* VACUUM = "vacuum"; const char* CRASH = "crash"; @@ -354,6 +355,7 @@ namespace beam (cli::RESET_ID, po::value()->default_value(false), "Reset self ID (used for network authentication). Must do if the node is cloned") (cli::ERASE_ID, po::value()->default_value(false), "Reset self ID (used for network authentication) and stop before re-creating the new one.") (cli::PRINT_TXO, po::value()->default_value(false), "Print TXO movements (create/spend) recognized by the owner key.") + (cli::MANUAL_ROLLBACK, po::value(), "Explicit rollback to height. The current consequent state will be forbidden (no automatic going up the same path)") (cli::CHECKDB, po::value()->default_value(false), "DB integrity check") (cli::VACUUM, po::value()->default_value(false), "DB vacuum (compact)") (cli::BBS_ENABLE, po::value()->default_value(true), "Enable SBBS messaging") diff --git a/utility/cli/options.h b/utility/cli/options.h index c8c5d24e7..d2cc83def 100644 --- a/utility/cli/options.h +++ b/utility/cli/options.h @@ -66,6 +66,7 @@ namespace beam extern const char* RESET_ID; extern const char* ERASE_ID; extern const char* PRINT_TXO; + extern const char* MANUAL_ROLLBACK; extern const char* CHECKDB; extern const char* VACUUM; extern const char* CRASH; From 3d7cda9f3484dc6e23ca1820e3d1c21801dfbfa0 Mon Sep 17 00:00:00 2001 From: valdok Date: Sat, 13 Jun 2020 14:33:22 +0300 Subject: [PATCH 122/136] Node: added RollbackLimit max depth and TimeoutSinceTip --- node/node.cpp | 11 ++++++++--- node/node.h | 9 +++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index 7bd6cf483..fffe00f64 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -781,9 +781,14 @@ void Node::Processor::get_ViewerKeys(ViewerKeys& vk) Height Node::Processor::get_MaxAutoRollback() { - return std::min( - NodeProcessor::get_MaxAutoRollback(), - get_ParentObj().m_Cfg.m_MaxAutoRollback); + Height h = NodeProcessor::get_MaxAutoRollback(); + if (m_Cursor.m_Full.m_Height >= Rules::HeightGenesis) + { + Timestamp ts_s = getTimestamp(); + if (ts_s < m_Cursor.m_Full.m_TimeStamp + get_ParentObj().m_Cfg.m_RollbackLimit.m_TimeoutSinceTip_s) + std::setmin(h, get_ParentObj().m_Cfg.m_RollbackLimit.m_Max); + } + return h; } void Node::Processor::OnEvent(Height h, const proto::Event::Base& evt) diff --git a/node/node.h b/node/node.h index 3e2a587ff..c68490a2d 100644 --- a/node/node.h +++ b/node/node.h @@ -84,8 +84,13 @@ struct Node // negative: number of cores minus number of mining threads. int m_VerificationThreads = 0; - Height m_MaxAutoRollback = 60; // artificial restriction on how much the node will rollback automatically - // in either case it's no more than Rules::MaxRollback + struct RollbackLimit + { + Height m_Max = 60; // artificial restriction on how much the node will rollback automatically + uint32_t m_TimeoutSinceTip_s = 3600; // further rollback is possible after this timeout since the current tip + // in either case it's no more than Rules::MaxRollback + + } m_RollbackLimit; struct Bbs { From 6eec7d48dfb9e57f2ef6ee6385918ac139053994 Mon Sep 17 00:00:00 2001 From: valdok Date: Sun, 14 Jun 2020 21:51:23 +0300 Subject: [PATCH 123/136] TxPool: removed ThresholdSet (map by tx validity height range). Not used. --- node/node.cpp | 2 +- node/processor.cpp | 2 +- node/txpool.cpp | 8 +++----- node/txpool.h | 12 +----------- 4 files changed, 6 insertions(+), 18 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index fffe00f64..a673ee8f9 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -559,7 +559,7 @@ void Node::Processor::DeleteOutdated() continue; Transaction& tx = *x.m_pValue; - if (proto::TxStatus::Ok != ValidateTxContextEx(tx, x.m_Threshold.m_Height, true)) + if (proto::TxStatus::Ok != ValidateTxContextEx(tx, x.m_Height, true)) txp.Delete(x); } } diff --git a/node/processor.cpp b/node/processor.cpp index 287453d3b..65abbc466 100644 --- a/node/processor.cpp +++ b/node/processor.cpp @@ -4269,7 +4269,7 @@ size_t NodeProcessor::GenerateNewBlockInternal(BlockContext& bc, BlockInterpretC Transaction& tx = *x.m_pValue; - bool bDelete = !x.m_Threshold.m_Height.IsInRange(bic.m_Height); + bool bDelete = !x.m_Height.IsInRange(bic.m_Height); if (!bDelete) { assert(!bic.m_LimitExceeded); diff --git a/node/txpool.cpp b/node/txpool.cpp index e37bf3b51..32f5b7eb8 100644 --- a/node/txpool.cpp +++ b/node/txpool.cpp @@ -48,12 +48,11 @@ TxPool::Fluff::Element* TxPool::Fluff::AddValidTx(Transaction::Ptr&& pValue, con Element* p = new Element; p->m_pValue = std::move(pValue); - p->m_Threshold.m_Height = ctx.m_Height; + p->m_Height = ctx.m_Height; p->m_Profit.m_Fee = ctx.m_Stats.m_Fee; p->m_Profit.SetSize(*p->m_pValue); p->m_Tx.m_Key = key; - m_setThreshold.insert(p->m_Threshold); m_setProfit.insert(p->m_Profit); m_setTxs.insert(p->m_Tx); @@ -68,7 +67,6 @@ void TxPool::Fluff::Delete(Element& x) assert(x.m_pValue); x.m_pValue.reset(); - m_setThreshold.erase(ThresholdSet::s_iterator_to(x.m_Threshold)); m_setProfit.erase(ProfitSet::s_iterator_to(x.m_Profit)); m_setTxs.erase(TxSet::s_iterator_to(x.m_Tx)); @@ -88,8 +86,8 @@ void TxPool::Fluff::Release(Element& x) void TxPool::Fluff::Clear() { - while (!m_setThreshold.empty()) - Delete(m_setThreshold.begin()->get_ParentObj()); + while (!m_setTxs.empty()) + Delete(m_setTxs.begin()->get_ParentObj()); } ///////////////////////////// diff --git a/node/txpool.h b/node/txpool.h index ef2223efc..fc70748bb 100644 --- a/node/txpool.h +++ b/node/txpool.h @@ -55,15 +55,7 @@ struct TxPool IMPLEMENT_GET_PARENT_OBJ(Element, m_Profit) } m_Profit; - struct Threshold - :public boost::intrusive::set_base_hook<> - { - HeightRange m_Height; - - bool operator < (const Threshold& t) const { return m_Height.m_Max < t.m_Height.m_Max; } - - IMPLEMENT_GET_PARENT_OBJ(Element, m_Threshold) - } m_Threshold; + HeightRange m_Height; struct Queue :public boost::intrusive::list_base_hook<> @@ -75,12 +67,10 @@ struct TxPool typedef boost::intrusive::multiset TxSet; typedef boost::intrusive::multiset ProfitSet; - typedef boost::intrusive::multiset ThresholdSet; typedef boost::intrusive::list Queue; TxSet m_setTxs; ProfitSet m_setProfit; - ThresholdSet m_setThreshold; Queue m_Queue; Element* AddValidTx(Transaction::Ptr&&, const Transaction::Context&, const Transaction::KeyType&); From c2644697ce5b0bf20840f83034be94127af5c93e Mon Sep 17 00:00:00 2001 From: valdok Date: Sun, 14 Jun 2020 22:54:15 +0300 Subject: [PATCH 124/136] TxPool: using m_setProfit for all active txs enumeration --- node/node.cpp | 8 +++----- node/txpool.cpp | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index a673ee8f9..e68faeeda 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -552,11 +552,9 @@ void Node::Processor::FlushInsanePeers() void Node::Processor::DeleteOutdated() { TxPool::Fluff& txp = get_ParentObj().m_TxPool; - for (TxPool::Fluff::Queue::iterator it = txp.m_Queue.begin(); txp.m_Queue.end() != it; ) + for (TxPool::Fluff::ProfitSet::iterator it = txp.m_setProfit.begin(); txp.m_setProfit.end() != it; ) { TxPool::Fluff::Element& x = (it++)->get_ParentObj(); - if (!x.m_pValue) - continue; Transaction& tx = *x.m_pValue; if (proto::TxStatus::Ok != ValidateTxContextEx(tx, x.m_Height, true)) @@ -688,10 +686,10 @@ void Node::Processor::OnRolledBack() // Delete shielded txs which referenced shielded outputs which were reverted TxPool::Fluff& txp = get_ParentObj().m_TxPool; - for (TxPool::Fluff::Queue::iterator it = txp.m_Queue.begin(); txp.m_Queue.end() != it; ) + for (TxPool::Fluff::ProfitSet::iterator it = txp.m_setProfit.begin(); txp.m_setProfit.end() != it; ) { TxPool::Fluff::Element& x = (it++)->get_ParentObj(); - if (x.m_pValue && !IsShieldedInPool(*x.m_pValue)) + if (!IsShieldedInPool(*x.m_pValue)) txp.Delete(x); } diff --git a/node/txpool.cpp b/node/txpool.cpp index 32f5b7eb8..13e5de971 100644 --- a/node/txpool.cpp +++ b/node/txpool.cpp @@ -86,8 +86,8 @@ void TxPool::Fluff::Release(Element& x) void TxPool::Fluff::Clear() { - while (!m_setTxs.empty()) - Delete(m_setTxs.begin()->get_ParentObj()); + while (!m_setProfit.empty()) + Delete_(m_setProfit.begin()->get_ParentObj()); } ///////////////////////////// From 5719f82d099e9f9b83945e9e9f20161378617f97 Mon Sep 17 00:00:00 2001 From: valdok Date: Sun, 14 Jun 2020 23:36:20 +0300 Subject: [PATCH 125/136] TxPool: storing "outdated" txs for up to defined depth. Restoring them back in case of rollback --- node/node.cpp | 45 +++++++++++++++++++++++++++++++++++++------ node/processor.cpp | 2 +- node/txpool.cpp | 48 ++++++++++++++++++++++++++++++++++++++++------ node/txpool.h | 19 ++++++++++++++++++ 4 files changed, 101 insertions(+), 13 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index e68faeeda..1f5a89c93 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -552,13 +552,31 @@ void Node::Processor::FlushInsanePeers() void Node::Processor::DeleteOutdated() { TxPool::Fluff& txp = get_ParentObj().m_TxPool; + + Height h = get_ParentObj().m_Cfg.m_RollbackLimit.m_Max; + std::setmin(h, Rules::get().MaxRollback); + + if (m_Cursor.m_ID.m_Height > h) + { + h = m_Cursor.m_ID.m_Height - h; + + while (!txp.m_setOutdated.empty()) + { + TxPool::Fluff::Element& x = txp.m_setOutdated.begin()->get_ParentObj(); + if (x.m_Outdated.m_Height > h) + break; + + txp.Delete(x); + } + } + for (TxPool::Fluff::ProfitSet::iterator it = txp.m_setProfit.begin(); txp.m_setProfit.end() != it; ) { TxPool::Fluff::Element& x = (it++)->get_ParentObj(); Transaction& tx = *x.m_pValue; if (proto::TxStatus::Ok != ValidateTxContextEx(tx, x.m_Height, true)) - txp.Delete(x); + txp.SetOutdated(x, m_Cursor.m_ID.m_Height); } } @@ -684,13 +702,25 @@ void Node::Processor::OnRolledBack() { LOG_INFO() << "Rolled back to: " << m_Cursor.m_ID; - // Delete shielded txs which referenced shielded outputs which were reverted TxPool::Fluff& txp = get_ParentObj().m_TxPool; + while (!txp.m_setOutdated.empty()) + { + TxPool::Fluff::Element& x = txp.m_setOutdated.rbegin()->get_ParentObj(); + if (x.m_Outdated.m_Height <= m_Cursor.m_ID.m_Height) + break; + + txp.SetOutdated(x, MaxHeight); // may be deferred by the next loop + } + + // Shielded txs that referenced shielded outputs which were reverted - must be reprocessed for (TxPool::Fluff::ProfitSet::iterator it = txp.m_setProfit.begin(); txp.m_setProfit.end() != it; ) { TxPool::Fluff::Element& x = (it++)->get_ParentObj(); if (!IsShieldedInPool(*x.m_pValue)) - txp.Delete(x); + { + get_ParentObj().OnTransactionDeferred(std::move(x.m_pValue), nullptr, true); + get_ParentObj().m_TxPool.DeleteEmpty(x); + } } TxPool::Stem& txps = get_ParentObj().m_Dandelion; @@ -2656,9 +2686,12 @@ uint8_t Node::OnTransactionFluff(Transaction::Ptr&& ptxArg, const PeerID* pSende TxPool::Fluff::Element* pNewTxElem = m_TxPool.AddValidTx(std::move(ptx), ctx, key.m_Key); - while (m_TxPool.m_setProfit.size() > m_Cfg.m_MaxPoolTransactions) + while (m_TxPool.m_setProfit.size() + m_TxPool.m_setOutdated.size() > m_Cfg.m_MaxPoolTransactions) { - TxPool::Fluff::Element& txDel = m_TxPool.m_setProfit.rbegin()->get_ParentObj(); + TxPool::Fluff::Element& txDel = m_TxPool.m_setOutdated.empty() ? + m_TxPool.m_setProfit.rbegin()->get_ParentObj() : + m_TxPool.m_setOutdated.begin()->get_ParentObj(); + if (&txDel == pNewTxElem) pNewTxElem = nullptr; // Anti-spam protection: in case the maximum pool capacity is reached - ensure this tx is any better BEFORE broadcasting ti @@ -2816,7 +2849,7 @@ void Node::Peer::BroadcastTxs() SetTxCursor(&itNext->get_ParentObj()); - if (!m_pCursorTx->m_pValue) + if (!m_pCursorTx->m_pValue || m_pCursorTx->IsOutdated()) continue; // already deleted proto::HaveTransaction msgOut; diff --git a/node/processor.cpp b/node/processor.cpp index 65abbc466..16812576c 100644 --- a/node/processor.cpp +++ b/node/processor.cpp @@ -4292,7 +4292,7 @@ size_t NodeProcessor::GenerateNewBlockInternal(BlockContext& bc, BlockInterpretC } if (bDelete) - bc.m_TxPool.Delete(x); // isn't available in this context + bc.m_TxPool.SetOutdated(x, h); // isn't available in this context } LOG_INFO() << "GenerateNewBlock: size of block = " << ssc.m_Counter.m_Value << "; amount of tx = " << nTxNum; diff --git a/node/txpool.cpp b/node/txpool.cpp index 13e5de971..593da50e3 100644 --- a/node/txpool.cpp +++ b/node/txpool.cpp @@ -52,9 +52,10 @@ TxPool::Fluff::Element* TxPool::Fluff::AddValidTx(Transaction::Ptr&& pValue, con p->m_Profit.m_Fee = ctx.m_Stats.m_Fee; p->m_Profit.SetSize(*p->m_pValue); p->m_Tx.m_Key = key; + p->m_Outdated.m_Height = MaxHeight; + assert(!p->IsOutdated()); - m_setProfit.insert(p->m_Profit); - m_setTxs.insert(p->m_Tx); + InternalInsert(*p); p->m_Queue.m_Refs = 1; m_Queue.push_back(p->m_Queue); @@ -62,14 +63,46 @@ TxPool::Fluff::Element* TxPool::Fluff::AddValidTx(Transaction::Ptr&& pValue, con return p; } +void TxPool::Fluff::SetOutdated(Element& x, Height h) +{ + InternalErase(x); + x.m_Outdated.m_Height = h; + InternalInsert(x); +} + +void TxPool::Fluff::InternalInsert(Element& x) +{ + if (x.IsOutdated()) + m_setOutdated.insert(x.m_Outdated); + else + { + m_setTxs.insert(x.m_Tx); + m_setProfit.insert(x.m_Profit); + } +} + +void TxPool::Fluff::InternalErase(Element& x) +{ + if (x.IsOutdated()) + m_setOutdated.erase(OutdatedSet::s_iterator_to(x.m_Outdated)); + else + { + m_setTxs.erase(TxSet::s_iterator_to(x.m_Tx)); + m_setProfit.erase(ProfitSet::s_iterator_to(x.m_Profit)); + } +} + void TxPool::Fluff::Delete(Element& x) { assert(x.m_pValue); x.m_pValue.reset(); + DeleteEmpty(x); +} - m_setProfit.erase(ProfitSet::s_iterator_to(x.m_Profit)); - m_setTxs.erase(TxSet::s_iterator_to(x.m_Tx)); - +void TxPool::Fluff::DeleteEmpty(Element& x) +{ + assert(!x.m_pValue); + InternalErase(x); Release(x); } @@ -87,7 +120,10 @@ void TxPool::Fluff::Release(Element& x) void TxPool::Fluff::Clear() { while (!m_setProfit.empty()) - Delete_(m_setProfit.begin()->get_ParentObj()); + Delete(m_setProfit.begin()->get_ParentObj()); + + while (!m_setOutdated.empty()) + Delete(m_setOutdated.begin()->get_ParentObj()); } ///////////////////////////// diff --git a/node/txpool.h b/node/txpool.h index fc70748bb..a2844fd68 100644 --- a/node/txpool.h +++ b/node/txpool.h @@ -57,28 +57,47 @@ struct TxPool HeightRange m_Height; + struct Outdated + :public boost::intrusive::set_base_hook<> + { + Height m_Height; + + bool operator < (const Outdated& t) const { return m_Height < t.m_Height; } + IMPLEMENT_GET_PARENT_OBJ(Element, m_Outdated) + } m_Outdated; + struct Queue :public boost::intrusive::list_base_hook<> { uint32_t m_Refs = 0; IMPLEMENT_GET_PARENT_OBJ(Element, m_Queue) } m_Queue; + + bool IsOutdated() const { return MaxHeight != m_Outdated.m_Height; } }; typedef boost::intrusive::multiset TxSet; typedef boost::intrusive::multiset ProfitSet; + typedef boost::intrusive::multiset OutdatedSet; typedef boost::intrusive::list Queue; TxSet m_setTxs; ProfitSet m_setProfit; + OutdatedSet m_setOutdated; Queue m_Queue; Element* AddValidTx(Transaction::Ptr&&, const Transaction::Context&, const Transaction::KeyType&); + void SetOutdated(Element&, Height); void Delete(Element&); + void DeleteEmpty(Element&); void Release(Element&); void Clear(); ~Fluff() { Clear(); } + + private: + void InternalInsert(Element&); + void InternalErase(Element&); }; struct Stem From 68f2b3a85e6d12077021c0e49426ebf52bc7ad1d Mon Sep 17 00:00:00 2001 From: valdok Date: Wed, 27 May 2020 13:57:46 +0300 Subject: [PATCH 126/136] Asset::Proof generation: sticking to [0..N] for all asset types up to N/2 --- core/block_crypt.cpp | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/core/block_crypt.cpp b/core/block_crypt.cpp index ce44747c9..1266cc69b 100644 --- a/core/block_crypt.cpp +++ b/core/block_crypt.cpp @@ -2612,26 +2612,25 @@ namespace beam uint32_t N = Rules::get().CA.m_ProofCfg.get_N(); assert(N); - ECC::Hash::Value hv; - ECC::Hash::Processor() << skGen >> hv; + if (aid > N / 2) + { + ECC::Hash::Value hv; + ECC::Hash::Processor() << skGen >> hv; - uint32_t nPos; - hv.ExportWord<0>(nPos); - nPos %= N; // the position of this element in the list + uint32_t nPos; + hv.ExportWord<0>(nPos); + nPos %= N; // the position of this element in the list - if (aid > nPos) - { - // TODO: don't exceed the max current asset count, for this we must query it - m_Begin = aid - nPos; - } - else - { - m_Begin = 0; - nPos = aid; + if (aid > nPos) + { + // TODO: don't exceed the max current asset count, for this we must query it + m_Begin = aid - nPos; + return nPos; + } } - assert(m_Begin + nPos == aid); - return nPos; + m_Begin = 0; + return aid; } bool Asset::Proof::IsValid(ECC::Point::Native& hGen, ECC::InnerProduct::BatchContext& bc, ECC::Scalar::Native* pKs) const From 4b991eda98db5a1cd03cefaab4680f096b560b26 Mon Sep 17 00:00:00 2001 From: "sergey.zavarza" Date: Fri, 5 Jun 2020 16:25:01 +0300 Subject: [PATCH 127/136] build fix --- wallet/core/wallet_db.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/core/wallet_db.cpp b/wallet/core/wallet_db.cpp index 64e81b71a..f419da8a8 100644 --- a/wallet/core/wallet_db.cpp +++ b/wallet/core/wallet_db.cpp @@ -2137,7 +2137,7 @@ namespace beam::wallet return true; } - virtual bool OnShieldedIn(const ShieldedTxo::DescriptionInp& dinp) + virtual bool OnShieldedIn(const ShieldedTxo::DescriptionInp& dinp) override { ShieldedSpendKeyMap::iterator it = m_mapShielded.find(dinp.m_SpendPk); if (m_mapShielded.end() != it) From be071c221a069b71b6f7bb8eb52c334def40aa7e Mon Sep 17 00:00:00 2001 From: valdok Date: Mon, 15 Jun 2020 19:59:26 +0300 Subject: [PATCH 128/136] Wallet potential crash fix on rollback --- wallet/core/wallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/core/wallet.cpp b/wallet/core/wallet.cpp index b819ac645..380b7ebc9 100644 --- a/wallet/core/wallet.cpp +++ b/wallet/core/wallet.cpp @@ -1059,7 +1059,7 @@ namespace beam::wallet { // Reconstruct tx with reset parameters and add it to the active list auto pTx = ConstructTransaction(tx.m_txId, tx.m_txType); - if (pTx->Rollback(sTip.m_Height)) + if (pTx && pTx->Rollback(sTip.m_Height)) { m_ActiveTransactions.emplace(tx.m_txId, pTx); UpdateOnSynced(pTx); From 625808c87e81bbdf946792c1ebe18e4b7fd1c587 Mon Sep 17 00:00:00 2001 From: "sergey.zavarza" Date: Thu, 4 Jun 2020 15:06:06 +0300 Subject: [PATCH 129/136] #1471 add parametr "android" and "ios" in Broadcaster (cherry picked from commit 0450d040e759eb4f01c8e750d0206a8d7d7c760a) --- wallet/broadcaster/broadcaster.cpp | 59 +++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/wallet/broadcaster/broadcaster.cpp b/wallet/broadcaster/broadcaster.cpp index 4654ebb7a..77102567b 100644 --- a/wallet/broadcaster/broadcaster.cpp +++ b/wallet/broadcaster/broadcaster.cpp @@ -73,24 +73,53 @@ bool parseUpdateInfo(const std::string& versionString, const std::string& typeSt bool parseWalletUpdateInfo(const std::string& versionString, const std::string& typeString, WalletImplVerInfo& walletVersionInfo) { VersionInfo::Application appType = VersionInfo::from_string(typeString); - if (appType != VersionInfo::Application::DesktopWallet) return false; + if (appType == VersionInfo::Application::Unknown) return false; - auto lastDot = versionString.find_last_of("."); - if (lastDot == std::string::npos) return false; - - Version libVersion; - if (bool res = libVersion.from_string(versionString.substr(0, lastDot)); !res) return false; - - auto uiRevisionStr = versionString.substr(lastDot + 1, versionString.length()); - size_t processed = 0; - uint32_t uiRevision = std::stoul(uiRevisionStr, &processed); - if (processed != uiRevisionStr.length()) return false; + Version libVersion = {0,0,0}; + uint32_t uiRevision = 0; + if (appType == VersionInfo::Application::DesktopWallet) + { + auto lastDot = versionString.find_last_of("."); + if (lastDot == std::string::npos) return false; + if (bool res = libVersion.from_string(versionString.substr(0, lastDot)); !res) return false; + auto uiRevisionStr = versionString.substr(lastDot + 1, versionString.length()); + + size_t processed = 0; + uiRevision = std::stoul(uiRevisionStr, &processed); + if (processed != uiRevisionStr.length()) return false; + } + else if (appType == VersionInfo::Application::AndroidWallet || + appType == VersionInfo::Application::IOSWallet) + { + if (bool res = libVersion.from_string(versionString); !res) return false; + uiRevision = libVersion.m_revision; + libVersion.m_revision = 0; + } + else + { + return false; + } walletVersionInfo.m_application = appType; walletVersionInfo.m_version = libVersion; walletVersionInfo.m_UIrevision = uiRevision; walletVersionInfo.m_title = "New version"; - walletVersionInfo.m_message = "Beam Wallet UI " + versionString; + + switch (appType) + { + case VersionInfo::Application::DesktopWallet: + walletVersionInfo.m_message = "Beam Wallet UI " + versionString; + break; + case VersionInfo::Application::AndroidWallet: + walletVersionInfo.m_message = "Android Wallet " + versionString; + break; + case VersionInfo::Application::IOSWallet: + walletVersionInfo.m_message = "IOS Wallet " + versionString; + break; + default: + assert(false); + } + return true; } @@ -327,7 +356,9 @@ namespace BroadcastMsg msg = BroadcastMsgCreator::createSignedMessage(rawMessage, key); broadcastRouter.sendMessage(contentType, msg); - if (contentType == BroadcastContentType::WalletUpdates) + // broadcast for 4.2 desktop ui // deprecated + if (contentType == BroadcastContentType::WalletUpdates && + walletVersionInfo.m_application == VersionInfo::Application::DesktopWallet) { VersionInfo versionInfo; versionInfo.m_application = walletVersionInfo.m_application; @@ -376,7 +407,7 @@ int main_impl(int argc, char* argv[]) messageDesc.add_options() (cli::PRIVATE_KEY, po::value(&options.privateKey), "private key to sign message") (cli::MESSAGE_TYPE, po::value(&options.messageType), "type of message: 'update' - info about available software updates, 'exchange' - info about current exchange rates") - (cli::UPDATE_VERSION, po::value(&options.walletUpdateInfo.version), "available software version in format 'x.x.x.x'") + (cli::UPDATE_VERSION, po::value(&options.walletUpdateInfo.version), "available software version in format 'x.x.x.x' for desktop or 'x.x.x' for IOS and Android") (cli::UPDATE_TYPE, po::value(&options.walletUpdateInfo.walletType), "updated software: 'desktop', 'android', 'ios'") (cli::EXCHANGE_CURR, po::value(&options.exchangeRate.currency), "currency: 'beam', 'btc', 'ltc', 'qtum'") (cli::EXCHANGE_RATE, po::value(&options.exchangeRate.rate), "exchange rate in decimal format: 100,000,000 = 1 usd") From 4a14f84500157d9eb726f030afd4dd457a1094f4 Mon Sep 17 00:00:00 2001 From: "sergey.zavarza" Date: Thu, 4 Jun 2020 15:08:42 +0300 Subject: [PATCH 130/136] #1471 unread notifications counter logic moved to wallet client (cherry picked from commit 711cd7e9b0907c8a72778573e48719bdeae5c2c5) --- .../extensions/notifications/notification.h | 2 +- .../notifications/notification_center.cpp | 26 ++-------------- .../notifications/notification_center.h | 7 +++-- wallet/client/wallet_client.cpp | 30 +++++++++++++++++-- 4 files changed, 35 insertions(+), 30 deletions(-) diff --git a/wallet/client/extensions/notifications/notification.h b/wallet/client/extensions/notifications/notification.h index f8a773a85..7bb3e6bd9 100644 --- a/wallet/client/extensions/notifications/notification.h +++ b/wallet/client/extensions/notifications/notification.h @@ -22,7 +22,7 @@ namespace beam::wallet { enum class Type : uint32_t { - SoftwareUpdateAvailable, + SoftwareUpdateAvailable, // deprecated AddressStatusChanged, WalletImplUpdateAvailable, BeamNews, diff --git a/wallet/client/extensions/notifications/notification_center.cpp b/wallet/client/extensions/notifications/notification_center.cpp index 2e92d2eba..f7662e7d2 100644 --- a/wallet/client/extensions/notifications/notification_center.cpp +++ b/wallet/client/extensions/notifications/notification_center.cpp @@ -68,31 +68,9 @@ namespace beam::wallet } size_t NotificationCenter::getUnreadCount( - VersionInfo::Application app, const Version& currentLibVersion, uint32_t currentClientRevision) const + std::function counter) const { - return std::count_if(m_cache.begin(), m_cache.end(), - [app, ¤tLibVersion, ¤tClientRevision](const auto& p) - { - if (p.second.m_state == Notification::State::Unread) - { - if (p.second.m_type == Notification::Type::WalletImplUpdateAvailable) - { - WalletImplVerInfo info; - if (fromByteBuffer(p.second.m_content, info) && - app == VersionInfo::Application::DesktopWallet && - (currentLibVersion < info.m_version || - (currentLibVersion == info.m_version && currentClientRevision < info.m_UIrevision))) - { - return true; - } - } - if (p.second.m_type == Notification::Type::TransactionFailed) - { - return true; - } - } - return false; - }); + return counter(m_cache.begin(), m_cache.end()); } void NotificationCenter::createNotification(const Notification& notification) diff --git a/wallet/client/extensions/notifications/notification_center.h b/wallet/client/extensions/notifications/notification_center.h index c8541bec0..fad747e73 100644 --- a/wallet/client/extensions/notifications/notification_center.h +++ b/wallet/client/extensions/notifications/notification_center.h @@ -30,6 +30,7 @@ namespace beam::wallet // TODO dh unittests of address notifications public: + using Cache = std::unordered_map; NotificationCenter( IWalletDB& storage, const std::map& activeNotifications, io::Reactor::Ptr reactor); @@ -38,8 +39,8 @@ namespace beam::wallet void deleteNotification(const ECC::uintBig& notificationID); void switchOnOffNotifications(Notification::Type, bool); - size_t getUnreadCount( - VersionInfo::Application app, const Version& currentLibVersion, uint32_t currentClientRevision) const; + size_t NotificationCenter::getUnreadCount( + std::function counter) const; void Subscribe(INotificationsObserver* observer); void Unsubscribe(INotificationsObserver* observer); @@ -64,7 +65,7 @@ namespace beam::wallet IWalletDB& m_storage; std::map m_activeNotifications; - std::unordered_map m_cache; + Cache m_cache; std::vector m_subscribers; std::vector m_myAddresses; diff --git a/wallet/client/wallet_client.cpp b/wallet/client/wallet_client.cpp index 22f29c33b..00400e859 100644 --- a/wallet/client/wallet_client.cpp +++ b/wallet/client/wallet_client.cpp @@ -1153,9 +1153,35 @@ namespace beam::wallet void WalletClient::updateNotifications() { - size_t count = m_notificationCenter->getUnreadCount( - VersionInfo::Application::DesktopWallet, getLibVersion(), getClientRevision()); + [this] (NotificationCenter::Cache::const_iterator first, NotificationCenter::Cache::const_iterator last) + { + auto currentLibVersion = getLibVersion(); + auto currentClientRevision = getClientRevision(); + return std::count_if(first, last, + [¤tLibVersion, ¤tClientRevision](const auto& p) + { + if (p.second.m_state == Notification::State::Unread) + { + if (p.second.m_type == Notification::Type::WalletImplUpdateAvailable) + { + WalletImplVerInfo info; + if (fromByteBuffer(p.second.m_content, info) && + VersionInfo::Application::DesktopWallet == info.m_application && + (currentLibVersion < info.m_version || + (currentLibVersion == info.m_version && currentClientRevision < info.m_UIrevision))) + { + return true; + } + } + if (p.second.m_type == Notification::Type::TransactionFailed) + { + return true; + } + } + return false; + }); + }); postFunctionToClientContext([this, count]() { m_unreadNotificationsCount = count; From 8722849a6d0fd56c8897a3da769719a5c6818787 Mon Sep 17 00:00:00 2001 From: "sergey.zavarza" Date: Fri, 5 Jun 2020 11:26:07 +0300 Subject: [PATCH 131/136] #1471 build fix (cherry picked from commit c236c882e470e02014da6c9a8d57b7ef5ba1c05d) --- wallet/client/extensions/notifications/notification_center.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/client/extensions/notifications/notification_center.h b/wallet/client/extensions/notifications/notification_center.h index fad747e73..cc50d7d1e 100644 --- a/wallet/client/extensions/notifications/notification_center.h +++ b/wallet/client/extensions/notifications/notification_center.h @@ -39,7 +39,7 @@ namespace beam::wallet void deleteNotification(const ECC::uintBig& notificationID); void switchOnOffNotifications(Notification::Type, bool); - size_t NotificationCenter::getUnreadCount( + size_t getUnreadCount( std::function counter) const; void Subscribe(INotificationsObserver* observer); From 762b9295c764c7b16ac74aa827a253f3da82dcd1 Mon Sep 17 00:00:00 2001 From: "sergey.zavarza" Date: Fri, 5 Jun 2020 17:32:39 +0300 Subject: [PATCH 132/136] android notification problem fix (cherry picked from commit 461958e05638cfd18e98c8783281f8a1d8e1a691) --- .../core/entities/dto/NotificationDTO.java | 4 +-- android/jni.cpp | 14 +++++----- android/wallet_model.cpp | 26 ++++++++++++------- wallet/client/wallet_client.cpp | 6 ----- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/android/com/mw/beam/beamwallet/core/entities/dto/NotificationDTO.java b/android/com/mw/beam/beamwallet/core/entities/dto/NotificationDTO.java index e899fa140..46cbf11f2 100644 --- a/android/com/mw/beam/beamwallet/core/entities/dto/NotificationDTO.java +++ b/android/com/mw/beam/beamwallet/core/entities/dto/NotificationDTO.java @@ -29,9 +29,9 @@ public enum State public enum Type // used to point Notification::Type in Wallet::switchOnOffNotifications() { - SoftwareUpdateAvailable, // 0 + Unused, // 0 AddressStatusChanged, - Unused, + WalletImplUpdateAvailable, BeamNews, TransactionFailed, TransactionCompleted diff --git a/android/jni.cpp b/android/jni.cpp index a7a615154..0b1d117a3 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -73,12 +73,12 @@ namespace std::map initNotifications(bool initialValue) { return std::map { - { Notification::Type::SoftwareUpdateAvailable, initialValue }, - { Notification::Type::BeamNews, initialValue }, - { Notification::Type::WalletImplUpdateAvailable, false }, - { Notification::Type::TransactionCompleted, initialValue }, - { Notification::Type::TransactionFailed, initialValue }, - { Notification::Type::AddressStatusChanged, initialValue } + { Notification::Type::SoftwareUpdateAvailable, false }, + { Notification::Type::BeamNews, initialValue }, + { Notification::Type::WalletImplUpdateAvailable, initialValue }, + { Notification::Type::TransactionCompleted, initialValue }, + { Notification::Type::TransactionFailed, initialValue }, + { Notification::Type::AddressStatusChanged, initialValue } }; } @@ -601,7 +601,7 @@ JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(switchOnOffExchangeRates)(JNIE JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(switchOnOffNotifications)(JNIEnv *env, jobject thiz, jint notificationTypeEnum, jboolean isActive) { - if (notificationTypeEnum < static_cast(Notification::Type::SoftwareUpdateAvailable) + if (notificationTypeEnum <= static_cast(Notification::Type::SoftwareUpdateAvailable) || notificationTypeEnum > static_cast(Notification::Type::TransactionCompleted)) { LOG_ERROR() << "Notification type is not valid!!!"; diff --git a/android/wallet_model.cpp b/android/wallet_model.cpp index 41096670e..634ca342d 100644 --- a/android/wallet_model.cpp +++ b/android/wallet_model.cpp @@ -163,23 +163,27 @@ namespace void callSoftwareUpdateNotification(JNIEnv* env, const Notification& notification, ChangeAction action) { - VersionInfo versionInfo; + WalletImplVerInfo walletVersionInfo; - if (fromByteBuffer(notification.m_content, versionInfo)) + if (fromByteBuffer(notification.m_content, walletVersionInfo)) { jobject jNotificationInfo = fillNotificationInfo(env, notification); jobject jVersionInfo = env->AllocObject(VersionInfoClass); { - setIntField(env, VersionInfoClass, jVersionInfo, "application", beam::underlying_cast(versionInfo.m_application)); - setLongField(env, VersionInfoClass, jVersionInfo, "versionMajor", versionInfo.m_version.m_major); - setLongField(env, VersionInfoClass, jVersionInfo, "versionMinor", versionInfo.m_version.m_minor); - setLongField(env, VersionInfoClass, jVersionInfo, "versionRevision", versionInfo.m_version.m_revision); + walletVersionInfo. + setIntField(env, VersionInfoClass, jVersionInfo, "application", beam::underlying_cast(walletVersionInfo.m_application)); + setLongField(env, VersionInfoClass, jVersionInfo, "versionMajor", walletVersionInfo.m_version.m_major); + setLongField(env, VersionInfoClass, jVersionInfo, "versionMinor", walletVersionInfo.m_version.m_minor); + setLongField(env, VersionInfoClass, jVersionInfo, "versionRevision", walletVersionInfo.m_UIrevision); } - jmethodID callback = env->GetStaticMethodID(WalletListenerClass, "onNewVersionNotification", "(IL" BEAM_JAVA_PATH "/entities/dto/NotificationDTO;L" BEAM_JAVA_PATH "/entities/dto/VersionInfoDTO;)V"); + if (walletVersionInfo.m_application == VersionInfo::Application::AndroidWallet) + { + jmethodID callback = env->GetStaticMethodID(WalletListenerClass, "onNewVersionNotification", "(IL" BEAM_JAVA_PATH "/entities/dto/NotificationDTO;L" BEAM_JAVA_PATH "/entities/dto/VersionInfoDTO;)V"); - env->CallStaticVoidMethod(WalletListenerClass, callback, action, jNotificationInfo, jVersionInfo); + env->CallStaticVoidMethod(WalletListenerClass, callback, action, jNotificationInfo, jVersionInfo); + } env->DeleteLocalRef(jNotificationInfo); env->DeleteLocalRef(jVersionInfo); @@ -569,8 +573,10 @@ void WalletModel::onNotificationsChanged(ChangeAction action, const std::vector< switch(notification.m_type) { case Notification::Type::SoftwareUpdateAvailable: - callSoftwareUpdateNotification(env, notification, action); - break; + break; + case Notification::Type::WalletImplUpdateAvailable: + callSoftwareUpdateNotification(env, notification, action); + break; case Notification::Type::AddressStatusChanged: callAddressStatusNotification(env, notification, action); break; diff --git a/wallet/client/wallet_client.cpp b/wallet/client/wallet_client.cpp index 00400e859..7ae3f89e5 100644 --- a/wallet/client/wallet_client.cpp +++ b/wallet/client/wallet_client.cpp @@ -18,7 +18,6 @@ #include "core/block_rw.h" //#include "keykeeper/trezor_key_keeper.h" #include "extensions/broadcast_gateway/broadcast_router.h" -#include "extensions/news_channels/updates_provider.h" #include "extensions/news_channels/wallet_updates_provider.h" #include "extensions/news_channels/exchange_rate_provider.h" @@ -402,18 +401,13 @@ namespace beam::wallet } // Other content providers using broadcast messages - auto updatesProvider = make_shared(*broadcastRouter, *broadcastValidator); auto walletUpdatesProvider = make_shared(*broadcastRouter, *broadcastValidator); auto exchangeRateProvider = make_shared( *broadcastRouter, *broadcastValidator, *m_walletDB, isSecondCurrencyEnabled); - m_updatesProvider = updatesProvider; m_exchangeRateProvider = exchangeRateProvider; m_walletUpdatesProvider = walletUpdatesProvider; - using NewsSubscriber = ScopedSubscriber; using WalletUpdatesSubscriber = ScopedSubscriber; using ExchangeRatesSubscriber = ScopedSubscriber; - auto newsSubscriber = make_unique(static_cast( - m_notificationCenter.get()), updatesProvider); auto walletUpdatesSubscriber = make_unique(static_cast( m_notificationCenter.get()), walletUpdatesProvider); auto ratesSubscriber = make_unique( From c9cd660c175c69c50a51271dd12672965ac57b7e Mon Sep 17 00:00:00 2001 From: "sergey.zavarza" Date: Fri, 5 Jun 2020 17:43:55 +0300 Subject: [PATCH 133/136] build fix (cherry picked from commit b552de3ac2077c99019e25088061a0cf355b9632) --- android/wallet_model.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/android/wallet_model.cpp b/android/wallet_model.cpp index 634ca342d..fea1fe5b8 100644 --- a/android/wallet_model.cpp +++ b/android/wallet_model.cpp @@ -171,7 +171,6 @@ namespace jobject jVersionInfo = env->AllocObject(VersionInfoClass); { - walletVersionInfo. setIntField(env, VersionInfoClass, jVersionInfo, "application", beam::underlying_cast(walletVersionInfo.m_application)); setLongField(env, VersionInfoClass, jVersionInfo, "versionMajor", walletVersionInfo.m_version.m_major); setLongField(env, VersionInfoClass, jVersionInfo, "versionMinor", walletVersionInfo.m_version.m_minor); From 3d2e06f96babacd342aafa2a8de513bb21d65df5 Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 16 Jun 2020 17:39:34 +0300 Subject: [PATCH 134/136] io::EvtIdle: crash fix (handle not closed) --- utility/io/timer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/utility/io/timer.cpp b/utility/io/timer.cpp index 9f60fd771..6cdcd6236 100644 --- a/utility/io/timer.cpp +++ b/utility/io/timer.cpp @@ -70,6 +70,7 @@ void IdleEvt::cancel() { m_Set = false; uv_idle_stop(&m_Handle); + uv_close(reinterpret_cast(&Cast::Down(m_Handle)), nullptr); } } From ba6acc1939581f722acf28939fbca2963af31cd4 Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 16 Jun 2020 17:39:50 +0300 Subject: [PATCH 135/136] WalletClient: potential crash on shutdown fix (IdleEvt must be cancelled while seeing the same reactor) --- wallet/client/wallet_client.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wallet/client/wallet_client.cpp b/wallet/client/wallet_client.cpp index 7ae3f89e5..1ad373200 100644 --- a/wallet/client/wallet_client.cpp +++ b/wallet/client/wallet_client.cpp @@ -427,6 +427,8 @@ namespace beam::wallet nodeNetworkSubscriber.reset(); assert(nodeNetwork.use_count() == 1); nodeNetwork.reset(); + + m_DeferredBalanceUpdate.cancel(); // for more safety, while we see the same reactor } catch (const runtime_error& ex) { From 347d4e50bfdcf522dac078776b52fe3df8e0da4e Mon Sep 17 00:00:00 2001 From: "sergey.zavarza" Date: Tue, 16 Jun 2020 20:09:52 +0300 Subject: [PATCH 136/136] [Android] master rules removed from jni --- android/jni.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/android/jni.cpp b/android/jni.cpp index 0b1d117a3..ee07409a9 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -56,15 +56,6 @@ namespace { static auto logger = Logger::create(LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG, "wallet_", (fs::path(appData) / fs::path("logs")).string()); - Rules::get().pForks[1].m_Height = 10; - Rules::get().pForks[2].m_Height = 20; - Rules::get().MaxRollback = 10; - Rules::get().CA.LockPeriod = 10; - Rules::get().Shielded.m_ProofMax.n = 4; - Rules::get().Shielded.m_ProofMax.M = 3; - Rules::get().Shielded.m_ProofMin.n = 4; - Rules::get().Shielded.m_ProofMin.M = 2; - Rules::get().Shielded.MaxWindowBacklog = 150; Rules::get().UpdateChecksum(); LOG_INFO() << "Beam Mobile Wallet " << appVersion << " (" << BRANCH_NAME << ") library: " << PROJECT_VERSION; LOG_INFO() << "Rules signature: " << Rules::get().get_SignatureStr();

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%0D2qX`+V_3 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�LngjJDoyV{#gBY5-od81SOWC#nw6GmMY#0jdH4Libd zEXlkShd;reRao}+aN&RT%eki5*5AHdgT^AUf8=$J^diIyK<+W8+JMbG+pj3%!N~t? z4VQ>qPWwQjfoRZBJEdgWhzjdAQs)8_Ixg{I)cUjSkBu)SfwZsnCc}AP7`uox8@>-R zyCkbBOq@aOet@xNoikoe7B6%(9KrxAtHn#$v-P^Dg+Ttzj;PMrTKBEFQk4W|F>PhQ zmpf~A-fBQI-^a(ZjKARyy9-Kl3v0`)J*bC~KxowOou*O%CcuznN6OaSumfl{=Ri zMB@-C=Z8%Pf>6*RKVv%OB#_Otd}m}5-eu0h_2__$m&CyG_qi;pPLqsSES9ZAN?552Z z%}!s7drd70gRC+e%Ez~eiL&$fkVREkVE%VOnKLZ`&-2vsl{gmflb2r5QHK-9|Jjdk BpfCUc literal 5370 zcmVPx}v`IukRCod1TnTg(Rl5FeRd*+ytrHSR2uTQthAo68Y%UN~LV3DXlk}FP zyCITK9hSZ}-1-BXAn&-h1y=mOQs|jL`G~Aw-_0BToQ>AdsX(Pvm`~9F7h& z3W!GDH1PhQBCuE2^}V_xw%>e9@mBVuovvYXOub7_rRkZPKrttKkxOrzx<{-{-k~hV zQL!Vc2NSqDg0_(`eqgnjSMDv}S`k%8VK(X&fL_SeV;h@Ltm|0F$z06ID1qat7W=SW zEW>VPH5_OTEDkpMgHZmGklN>OJ9lnq3Rx+N%u@o;M@716$2YixV)P%>C8?pt zVNCHpoaSG!9jVcPj1+-!4*{>K8;kL`>1aJ+E+in zvJ!6*m<8;B5QL_z^MI?C0a@n*PCHPypYkKrJDeR)gw@Nto zaqM?SZFS3>R9pX&+Q!OmUP;g0Ma@CWM(CEK$M7g0aXY~Ys~t}jO{x&vA(i?*u?{Y@^*kg08alb@>4emwckkS}+~HpoUMj4K1$OmJx<1(H#xm-e zae-ysrPD?L*S-(@BOi#ThH_FjU-%cmMQJK|kzlQ7>j185@2?e&)KzbJz^cK4_U!Pk zLVOJiu0C|AB*KQE2NEGYm8xIJ7ru&IV~emUracVABm?g*Hd-bRAxCWjHr)s06$4UF zZTb`N?OWaVd_-*V=&Em(_u;0t3Ww+()N{IX%PMz#7*756IuQYslaW6^LGSx=zE*4* zsm-OHNN?|_$E%6j>8Cq^w{HNBP|PG<@Mj=(DDcMBM!Mf9E+0 zt;#Dnj@^hMOv%V5D|V0duxo+7!^k23X^cdT0cJc)*LeV4=@|rujBuF1ISI~!&sc}u z<rGq>kn&fzj^m30=iMH!Of8 z=SXna)W_k|IhazKy)P9W!e4pey^=)Adr%zI%B&{_+Opbb>a zK=W~6{G9@;Zv-|!K@KCRNja=L5g7ebpydSDA?5y)kSQAm;2ixDjMC=A%2Wf6pj9*k zSCr7}m}N^$-%XHqg{t72*Zpf}&4KBoE`-q5(ku4b9^dBv_X<>+>1im?u11bN$-gil zHSZmY4#nxc+d1LG{)N+@CRbfTU3Cj^=p&;nh8l0!HNbg)H0n#GzUx(>jhdw^Dixn$ z2mPu8%0}{(znn^Oqk})QC!N$S2j%4C4;F5GNW&7})gXNHskm`M9KbH+ZR{3rljWUA z(Q{ztI}M~tGI&B3Fzq2=z`68`4j470b=&o_;R;9#SN;jmbOdnI!nctj3dltt-VNjw z0rjQ8IpoB)I&xMBcS(wVo_;Cv^rG+)bwTb^~cG>p{YxNMvRzm zaWqv+6*(w$)9!O6dmj>?Q&+uA*LFVzF9k`+>}b?d4V0}1wm(mvr{GF4lUy_TchouS zX!7X}JWY=se)Y!uOk{7hvydMq??e%8RLORK7O`Lmd}k1hdVoEFl)qj)KhO_k61&O z(oL?)g;cPTq}8e_A(vEeF}0bxWFRp8NnpqoROJ?zWsp`_>dRV`Wj41SN~S(q8(3ea$z{Pb zIJ4k#fmzIqWb`z6++@|3Swt^@bI4s7_n!LgwpLhdRVm5;I0HVE=`Ck2U^ z-j?_)iq?Y8D!qHxLMA_`Y@)9EC+fvv#OY}v9nk%20IAsB-WAo<2dS$l6o>iFrC4T= zvvLW{_J7b-sN@pnQDF5=?cAa zMieD9)>M}gc{1pkqkeiG#ZPk8ELilopn*uGKK&``CvuR~U0D|ZbCw%xy5~m%V{Zcr z?=*n=hMcsEid-sp*)I1IM(`dtbeaTi+jG=u2aQLNi)u^?a(_`pE$$^Y>7=Hb6Stme zaO7x?i@jK{+>hs!X`XAP*xflu-pSSfd%rNikp)M;A~%pL_N*{Kl1``euh#wyNIna= z@-?HmYit*Zn8+8EIT?ePUOr>Y^$SR1e!Khrt z#g)4S$**4y;qq{KkB^I`k3L+xl8SvE`gG&?OT{jg^{0RCsY{`89g_XaYEj`4v3P6R zA~w0Kr)IrXuFSk1>Xgep-8b)UgC-+q^uW!>sC~mA8H$zrY}=IoL%H~hIx2=9b1vVu z|NEA)C67X9Xr%`dP(&F`{+He!#6>+c=)K~k6sYrm9@Kx!h(*v6`UmCrlp$kPtJUA) z@1_g!iSjttTv9N+L`Chgw(n9P3@@Hrb|dsT$k*mEq}CZ(Xn$7Vl_tMXkslHS7M!lMY0*7? z;DmaveFE*Z4}hWSgqzpQJ+?2E=dr{z6R)ecdEAC>!n0sdtw2plOuv?*$>rSXCFR^1 zP%pnJ=%G?c>n0-AyvUqvUO*%R2a zAR*uhVy~JMpH8P7+*>$}6cY>6@1BN;3m6dB0?oTy2@qG7KIHCOfY^O2A!JxFOp?H) z#rA=fV7nOGb$78fBEgZ0eT!!kVi)aS0yiOYJfKppHIlvX>Ocg%ujZ$sUj)zD-d z)tATxwzuZNu9krl(NNmqXXSBrt*u(kV*=b_hCLvS+IZBGaHCroIWz>s1HvYC@`W#(ll9&kDO z#q@<)m=QznvG8i*&qdLV6dd^&wn~&f&`AT7WJ^T9^u9<+>b@&6yb#Ld89`Ijt16(q z^I}JS?7kH+)qdNNZohH#pA1J%r%!7pXqTl=$31z!#^~gHSQHBZF~O|FpiNWINRFxF zrz9>J3yFdxHl`@r`881#1s1az$tgCZ3?7J>7z-+oRiX4?8QR)> z2HoL+xnLNY`dAV3(H6vg^)MPP`JbTL_VIU77k!M$Nu#ka>pH|yp*Of2sb{!k<+pw{ z4mWCDT+%Z1=+rcixJAO@fe$p%_%$*!HLxJuwAo^YYT{e-{%pxf$Q_h}=`)IOsO&Jd ze7zlq%PXKbeGOI%ftxrIqH_13sj~z4ReZI`*P-5p&)c zILZa=GbbQ^?U#t#{3sj)=%O(ipUAoWo}rA}xY&1?hhSIJ0c@!~3Qdhet2>EaP8~ro zfRI-=!Dw-|!A{P!yPVV~k%1!zC9yHFX9galC%e4`Qp^-pfz6ggkjyX>D3u`$6TveP zxZ&qtfD8H=KF_*p?m8R=DhQUg@h#~4=>SsvY=2-N*-LdlzXEX|Y=O!>AM2i1F(-Q= z?q|C+Cqt=P3l2BYv9re`UKxmH-2lercA?r)gKF+YH?+3E?o{D$S@}ZfR}nDIHgY01 zsx2Y?QnrlRQKXCD(KU5-^&XKbD=mk-m-#7ul985`jl|p`h+}{y)k2q@*89c*z{ofk zYE~^p*}m@(ckOJ%FSx=pfx`{QXjiRJ8e1^_pcPA!uf=S83f^mN#;&?LXbml}GH~pm z{XL`~L78hm%JoJZ*DM6ZiZ-VSF1LW2pNsIbW4?a}d50ksBZ3+sNa9~2HzWTc%It3= zY#Da-%mNk$p<)EmjMSYwOvD8tXow;{dJjQ?7Zg>yb`#h%7m z*hCgI+S`gm3u=>SsrZYtSkTm8-g5Pj@%W$yp5KE9_@M$ro)gqsOgOj+lO~PBz=2t~ zll{u=l=m5q*sv}W!@smblxh5mOhcok6({;saeH|Lk|?(Afstm4o1GyMo%_s+oe=3COZgL*AsVpESEyp zVDy)(FfK6>V;Bb<%RPjb7av1Y3iX%Oism>s+}lgg(olsab3AGXU5aK-QpUWb>6O3M zwi?8|F}v%%<)EiWkfDe|lRW$I!m}&+dB2_6S#)&0WK=Y_LX1T7N6d?Vr$kYDfJ?<4K}yd6I}86u-l1IM!%O=yx7( z&x*QBZ$tClPeAlZ59-Ff;&0Hme$tVzH`}2%@h7jIUkk5vIvMWp|FtsRxj!bj#uD6` zaAr;E=&Sw4l{%b(wG~8BYtM@I`u>569nZ?f9Xu|N6mfTz-#$c7%G4_$hUACrKq)MO zQZPAWnQvyz#%6{?;(fD%?sfU~R0wk02BT%@b+GRG-w>tYXGtvDYj?;&?#X_@pYpJ7O$%vaP3Exbo}NkynkU{9@uTG215YakX}du@smG5v zZ=xv(t!)Dys|*?j^v{7_aWJ4HiX=_F($GZzC^3r0{!O%)6gc~jXW;EC|AH=4qD0QU zjG-7`>QK_YnZ5lPuz_gAB4bWsZg=3wnTFIsz7W(mR~}^CT1Fj<`RkVBeA|7` z?=`BApB$4k(djv>!AW!DWV~h-2&SLV14wAMaH zT#mV?^Qocc8!?0dfF?hoz2X6z;BQLM6U^osxToEaX_^m`)ZP zIi8c|Am2&J19`@oGwm+QU50O2Z{Kqw-`{_*6gYWL__nR4*n5KLVwRsYrv^U5o0ie} zAI`t%3N;DumJ)Xe#YKF}Q%-gVSMGR{J3pq*TmOUoCvTyEl6mvz&sV?Lv}g1W>E8tY YKh@8hxy6wfJOBUy07*qoM6N<$f~9PIVE_OC From 3121bcabf63fd67f0309da55eda9f8f362023881 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Wed, 6 Feb 2019 18:30:04 +0300 Subject: [PATCH 020/136] deleteTx and cancelTx wrappers for android # Conflicts: # android/com/mw/beam/beamwallet/core/entities/Wallet.java # android/jni.cpp --- .../beam/beamwallet/core/entities/Wallet.java | 10 ++++---- android/jni.cpp | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/android/com/mw/beam/beamwallet/core/entities/Wallet.java b/android/com/mw/beam/beamwallet/core/entities/Wallet.java index 817c8c536..463d26efc 100644 --- a/android/com/mw/beam/beamwallet/core/entities/Wallet.java +++ b/android/com/mw/beam/beamwallet/core/entities/Wallet.java @@ -30,13 +30,13 @@ public class Wallet public native void getAddresses(boolean own); public native void generateNewAddress(); public native void saveAddress(WalletAddressDTO address, boolean own); - public native void deleteAddress(String walletID);//const beam::WalletID& id); + public native void cancelTx(String id); + public native void deleteTx(String id); + public native void deleteAddress(String walletID); // not implemented - public native void cancelTx();//const beam::TxID& id); - public native void deleteTx();//const beam::TxID& id); - public native void changeCurrentWalletIDs();//const beam::WalletID& senderID, const beam::WalletID& receiverID); - public native void setNodeAddress();//const std::string& addr); + public native void changeCurrentWalletIDs(); //const beam::WalletID& senderID, const beam::WalletID& receiverID); + public native void setNodeAddress(); //const std::string& addr); public native void changeWalletPassword();//const beam::SecString& password); } diff --git a/android/jni.cpp b/android/jni.cpp index 70bfeb8a7..d37ff7583 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -302,6 +302,30 @@ JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(saveAddress)(JNIEnv *env, jobj walletModel->getAsync()->saveAddress(addr, own); } +JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(cancelTx)(JNIEnv *env, jobject thiz, + jstring txId) +{ + LOG_DEBUG() << "cancelTx()"; + + auto buffer = from_hex(JString(env, txId).value()); + TxID id; + + std::copy_n(buffer.begin(), id.size(), id.begin()); + walletModel->getAsync()->cancelTx(id); +} + +JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(deleteTx)(JNIEnv *env, jobject thiz, + jstring txId) +{ + LOG_DEBUG() << "deleteTx()"; + + auto buffer = from_hex(JString(env, txId).value()); + TxID id; + + std::copy_n(buffer.begin(), id.size(), id.begin()); + walletModel->getAsync()->deleteTx(id); +} + JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(deleteAddress)(JNIEnv *env, jobject thiz, jstring walletID) { From 7353f1b6cbdade587cf337b745bf53b2cae61c7c Mon Sep 17 00:00:00 2001 From: Anatol Date: Wed, 13 Feb 2019 18:39:16 +0300 Subject: [PATCH 021/136] changed testnet ports --- .travis.yml | 6 +++--- beam/beam-node.cfg | 2 +- ui/model/settings.cpp | 2 +- ui/viewmodel/start_view.cpp | 4 ++-- utility/options.cpp | 2 +- wallet/beam-wallet.cfg | 3 --- 6 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 83325b310..2d918912d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -250,7 +250,7 @@ after_success: # deploy using ftp server - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER - tar -cvzf beam-node-testnet-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/beam beam-node-testnet beam-node.cfg - - tar -cvzf beam-wallet-testnet-cli-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/wallet beam-wallet-testnet beam-wallet.cfg + - tar -cvzf beam-wallet-cli-testnet-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/wallet beam-wallet-testnet beam-wallet.cfg - tar -cvzf wallet-api-testnet-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/wallet wallet-api-testnet wallet-api.cfg # prep for deploy to AWS S3 @@ -258,13 +258,13 @@ after_success: # upload binaries to FTP - curl --retry 3 --ftp-create-dirs -T beam-node-testnet-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - - curl --retry 3 --ftp-create-dirs -T beam-wallet-testnet-cli-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ + - curl --retry 3 --ftp-create-dirs -T beam-wallet-cli-testnet-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - curl --retry 3 --ftp-create-dirs -T wallet-api-testnet-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - curl --retry 3 --ftp-create-dirs -T "$HOME/build/BeamMW/beam/$BEAM_WALLET_UI_IN" "$BUILDS_SERVER_PATH/$BEAM_WALLET_UI_OUT" # upload binaries to S3 - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" beam-node-testnet-$BEAM_VERSION.tar.gz - - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" beam-wallet-testnet-cli-$BEAM_VERSION.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" beam-wallet-cli-testnet-$BEAM_VERSION.tar.gz - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" wallet-api-testnet-$BEAM_VERSION.tar.gz - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_OUT diff --git a/beam/beam-node.cfg b/beam/beam-node.cfg index f4d458ac3..02774f3ee 100644 --- a/beam/beam-node.cfg +++ b/beam/beam-node.cfg @@ -3,7 +3,7 @@ ################################################################################ # port to start server on -# port=10000 +# port=11000 # log level [info|debug|verbose] # log_level=debug diff --git a/ui/model/settings.cpp b/ui/model/settings.cpp index 115a920c6..50c66c5cf 100644 --- a/ui/model/settings.cpp +++ b/ui/model/settings.cpp @@ -128,7 +128,7 @@ uint WalletSettings::getLocalNodePort() const { Lock lock(m_mutex); #ifdef BEAM_TESTNET - return m_data.value(LocalNodePort, 10006).toUInt(); + return m_data.value(LocalNodePort, 11005).toUInt(); #else return m_data.value(LocalNodePort, 10005).toUInt(); #endif // BEAM_TESTNET diff --git a/ui/viewmodel/start_view.cpp b/ui/viewmodel/start_view.cpp index c19060706..ff54d88a1 100644 --- a/ui/viewmodel/start_view.cpp +++ b/ui/viewmodel/start_view.cpp @@ -533,7 +533,7 @@ QString StartViewModel::selectCustomWalletDB() QString StartViewModel::defaultPortToListen() const { #ifdef BEAM_TESTNET - return "10006"; + return "11005"; #else return "10005"; #endif // BEAM_TESTNET @@ -542,7 +542,7 @@ QString StartViewModel::defaultPortToListen() const QString StartViewModel::defaultRemoteNodeAddr() const { #ifdef BEAM_TESTNET - return "127.0.0.1:10006"; + return "127.0.0.1:11005"; #else return "127.0.0.1:10005"; #endif // BEAM_TESTNET diff --git a/utility/options.cpp b/utility/options.cpp index 6823fa4a4..436afb4cb 100644 --- a/utility/options.cpp +++ b/utility/options.cpp @@ -147,7 +147,7 @@ namespace beam po::options_description node_options("Node options"); node_options.add_options() - (cli::PORT_FULL, po::value()->default_value(10000), "port to start the server on") + (cli::PORT_FULL, po::value()->default_value(11000), "port to start the server on") (cli::STORAGE, po::value()->default_value("node.db"), "node storage path") (cli::HISTORY, po::value()->default_value(szLocalDir), "directory for compressed history") (cli::TEMP, po::value()->default_value(szTempDir), "temp directory for compressed history, must be on the same volume") diff --git a/wallet/beam-wallet.cfg b/wallet/beam-wallet.cfg index a15708f98..bce1d9918 100644 --- a/wallet/beam-wallet.cfg +++ b/wallet/beam-wallet.cfg @@ -2,9 +2,6 @@ # General options: ################################################################################ -# port to start server on -# port=10000 - # log level [info|debug|verbose] # log_level=debug From 79cf849a01e6abe360f52e4c197f02275293f377 Mon Sep 17 00:00:00 2001 From: Anatol Date: Fri, 15 Feb 2019 15:52:57 +0300 Subject: [PATCH 022/136] added failureReason and selfTx fields to TxDescriptionDTO --- .../mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java | 2 ++ android/wallet_model.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java b/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java index 441e3473e..d3d6d5467 100644 --- a/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java +++ b/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java @@ -27,6 +27,8 @@ public class TxDescriptionDTO public long createTime; public long modifyTime; public boolean sender; + public boolean selfTx public int status; public String kernelId; + public int failureReason; } diff --git a/android/wallet_model.cpp b/android/wallet_model.cpp index bfd8e31dd..f4a24d6cd 100644 --- a/android/wallet_model.cpp +++ b/android/wallet_model.cpp @@ -95,8 +95,10 @@ void WalletModel::onTxStatus(beam::ChangeAction action, const std::vector(item.m_status)); setStringField(env, TxDescriptionClass, tx, "kernelId", beam::to_hex(item.m_kernelID.m_pData, item.m_kernelID.nBytes)); + setIntField(env, TxDescriptionClass, tx, "failureReason", static_cast(item.m_failureReason)); env->SetObjectArrayElement(txItems, i, tx); From ad9f21c18bffb51a8a3eb3d0608f34e66a7ca398 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Tue, 19 Feb 2019 12:26:18 +0300 Subject: [PATCH 023/136] #115 added build configuration for android x86_64 --- .travis.yml | 34 ++++++++++++++++++++++++++++++++++ CMakeLists.txt | 2 ++ utility/CMakeLists.txt | 5 +++++ 3 files changed, 41 insertions(+) diff --git a/.travis.yml b/.travis.yml index 2d918912d..c8b986857 100644 --- a/.travis.yml +++ b/.travis.yml @@ -166,6 +166,40 @@ matrix: - curl --retry 3 --ftp-create-dirs -T libwallet-jni-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni-$BEAM_VERSION.tar.gz +############################################################################### +# Android x86_64 Release +############################################################################### + + - os: linux + language: android + env: + - ANDROID_ABI=x86_64 + - BUILD_TYPE=Release + - ANDROID_SDK_VERSION=23 + android: + components: + - tools + - platform-tools + - android-23 + install: + - echo y | sdkmanager "ndk-bundle" + - wget "https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.sh" + - sudo sh cmake-3.12.0-Linux-x86_64.sh --skip-license --prefix=/usr + - sudo git clone --depth=1 https://github.com/nesbox/boost_1_68-android.git /usr/local/boost_1_68-android + - sudo git clone --depth=1 https://github.com/nesbox/Prebuilt-OpenSSL-Android.git /usr/local/Prebuilt-OpenSSL-Android + - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle + - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android + - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android/Prebuilt + - export PATH=$ANDROID_NDK_HOME:$PATH + script: + - cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake -DANDROID_NATIVE_API_LEVEL=$ANDROID_SDK_VERSION -DANDROID_ABI=$ANDROID_ABI -DCMAKE_BUILD_TYPE=$BUILD_TYPE . + - make wallet-jni -j4 + after_success: + - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI + - tar -cvzf libwallet-jni-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/android libwallet-jni.so com + - curl --retry 3 --ftp-create-dirs -T libwallet-jni-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ + - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/android-$ANDROID_ABI/" libwallet-jni-$BEAM_VERSION.tar.gz + ############################################################################### # Android ARMv7 Release ############################################################################### diff --git a/CMakeLists.txt b/CMakeLists.txt index 429072c82..20f0d7428 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -207,6 +207,8 @@ if(ANDROID) set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/armv7-shared) elseif(ANDROID_ABI STREQUAL "x86") set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/x86-shared) + elseif(ANDROID_ABI STREQUAL "x86_64") + set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/x86_64-shared) elseif(ANDROID_ABI STREQUAL "arm64-v8a") set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/arm64-v8a-shared) else() diff --git a/utility/CMakeLists.txt b/utility/CMakeLists.txt index 273706011..523a642b7 100644 --- a/utility/CMakeLists.txt +++ b/utility/CMakeLists.txt @@ -78,6 +78,11 @@ if(ANDROID) $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_program_options-clang-mt-x32-1_68.a $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_filesystem-clang-mt-x32-1_68.a $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_system-clang-mt-x32-1_68.a) + elseif(ANDROID_ABI STREQUAL "x86_64") + target_link_libraries(utility + $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_program_options-clang-mt-x64-1_68.a + $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_filesystem-clang-mt-x64-1_68.a + $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_system-clang-mt-x64-1_68.a) elseif(ANDROID_ABI STREQUAL "arm64-v8a") target_link_libraries(utility $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_program_options-clang-mt-a64-1_68.a From 0f1b6dc89f8f653318d77bd99ec28ca90715a587 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Tue, 19 Feb 2019 12:44:47 +0300 Subject: [PATCH 024/136] fix android build --- .../mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java b/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java index d3d6d5467..ed06facdd 100644 --- a/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java +++ b/android/com/mw/beam/beamwallet/core/entities/dto/TxDescriptionDTO.java @@ -27,7 +27,7 @@ public class TxDescriptionDTO public long createTime; public long modifyTime; public boolean sender; - public boolean selfTx + public boolean selfTx; public int status; public String kernelId; public int failureReason; From d13e6c39c61a6ca700ed5aedbe09595ea1f428c3 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Tue, 19 Feb 2019 17:01:22 +0300 Subject: [PATCH 025/136] fixed problem with transaction to themself on android --- android/jni.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/android/jni.cpp b/android/jni.cpp index 5862932b1..131fa790a 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -249,16 +249,11 @@ JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(sendMoney)(JNIEnv *env, jobjec { LOG_DEBUG() << "sendMoney(" << JString(env, receiverAddr).value() << ", " << JString(env, comment).value() << ", " << amount << ", " << fee << ")"; - WalletAddress peerAddr; - peerAddr.m_walletID.FromHex(JString(env, receiverAddr).value()); - peerAddr.m_createTime = getTimestamp(); - - // TODO: implement UI for this situation - // TODO: don't save if you send to yourself - walletModel->getAsync()->saveAddress(peerAddr, false); + WalletID walletID(Zero); + walletID.FromHex(JString(env, receiverAddr).value()); // TODO: show 'operation in process' animation here? - walletModel->getAsync()->sendMoney(peerAddr.m_walletID + walletModel->getAsync()->sendMoney(walletID , JString(env, comment).value() , beam::Amount(amount) , beam::Amount(fee)); From cfa8cb9a733902ad857d74a7740075707bb1f30b Mon Sep 17 00:00:00 2001 From: Anatol Date: Tue, 26 Feb 2019 17:06:26 +0300 Subject: [PATCH 026/136] explorer-node changed maximum count of retrieved blocks --- explorer/adapter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer/adapter.cpp b/explorer/adapter.cpp index 13aa60334..90ed35095 100644 --- a/explorer/adapter.cpp +++ b/explorer/adapter.cpp @@ -335,7 +335,7 @@ class Adapter : public Node::IObserver, public IAdapter { } bool get_blocks(io::SerializedMsg& out, uint64_t startHeight, uint64_t n) override { - static const uint64_t maxElements = 100; + static const uint64_t maxElements = 1500; if (n > maxElements) n = maxElements; else if (n==0) n=1; Height endHeight = startHeight + n - 1; From 9cbcac08bc008bbd2a4567b85f0fda11c9fdf41c Mon Sep 17 00:00:00 2001 From: Anatol Date: Mon, 4 Mar 2019 16:52:12 +0300 Subject: [PATCH 027/136] #508 added callback to report rollbacks --- node/node.cpp | 4 ++++ node/node.h | 1 + 2 files changed, 5 insertions(+) diff --git a/node/node.cpp b/node/node.cpp index 91fa2b04a..c4b1270cb 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -534,6 +534,10 @@ void Node::Processor::OnRolledBack() { LOG_INFO() << "Rolled back to: " << m_Cursor.m_ID; get_ParentObj().m_Compressor.OnRolledBack(); + + IObserver* pObserver = get_ParentObj().m_Cfg.m_Observer; + if (pObserver) + pObserver->OnRolledBack(m_Cursor.m_ID); } bool Node::Processor::Verifier::ValidateAndSummarize(TxBase::Context& ctx, const TxBase& txb, TxBase::IReader&& r) diff --git a/node/node.h b/node/node.h index a61c71e9d..e786de7ed 100644 --- a/node/node.h +++ b/node/node.h @@ -34,6 +34,7 @@ struct Node { virtual void OnSyncProgress() = 0; virtual void OnStateChanged() {} + virtual void OnRolledBack(const Block::SystemState::ID& id) {}; }; struct Config From df3cf5074ddfc7a663512f7d33e5f59364015ec6 Mon Sep 17 00:00:00 2001 From: Vadim Grigoruk Date: Mon, 4 Mar 2019 17:22:00 +0300 Subject: [PATCH 028/136] #508 erase blocks cache on rollback --- explorer/adapter.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/explorer/adapter.cpp b/explorer/adapter.cpp index 90ed35095..4a746bc2f 100644 --- a/explorer/adapter.cpp +++ b/explorer/adapter.cpp @@ -147,6 +147,15 @@ class Adapter : public Node::IObserver, public IAdapter { if (_nextHook) _nextHook->OnStateChanged(); } + void OnRolledBack(const Block::SystemState::ID& id) override { + + auto& blocks = _cache.blocks; + + blocks.erase(blocks.lower_bound(id.m_Height), blocks.end()); + + if (_nextHook) _nextHook->OnRolledBack(id); + } + bool get_status(io::SerializedMsg& out) override { if (_statusDirty) { const auto& cursor = _nodeBackend.m_Cursor; From 65da82b7c3340834616c0d498ce868bc4e87c301 Mon Sep 17 00:00:00 2001 From: Vadim Grigoruk Date: Mon, 4 Mar 2019 18:58:24 +0300 Subject: [PATCH 029/136] merge latest API chenges to Testnet --- .gitignore | 1 + .travis.yml | 3 + CMakeLists.txt | 4 +- appveyor.yml | 12 +- explorer/adapter.cpp | 8 +- explorer/explorer-node.cfg | 21 +++ explorer/explorer_node.cpp | 88 +++++++++-- explorer/server.cpp | 18 ++- explorer/server.h | 3 +- utility/options.cpp | 10 +- utility/options.h | 9 ++ wallet/api.cpp | 62 +++++++- wallet/api.h | 57 ++++--- wallet/api_cli.cpp | 221 +++++++++++++++++++++++---- wallet/unittests/wallet_api_test.cpp | 43 +++++- wallet/wallet-api.cfg | 31 +++- wallet/wallet.cpp | 14 +- wallet/wallet.h | 8 +- wallet/wallet_client.cpp | 2 +- 19 files changed, 525 insertions(+), 90 deletions(-) create mode 100644 explorer/explorer-node.cfg diff --git a/.gitignore b/.gitignore index f8f81aa15..8edcbcc70 100644 --- a/.gitignore +++ b/.gitignore @@ -99,3 +99,4 @@ CMakeSettings.json beam/wallet.dat 3rdparty/opencl-miner/equihash_150_5.dat ui/beam.rc +beam_version.gen diff --git a/.travis.yml b/.travis.yml index c8b986857..b3c6e78db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -286,6 +286,7 @@ after_success: - tar -cvzf beam-node-testnet-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/beam beam-node-testnet beam-node.cfg - tar -cvzf beam-wallet-cli-testnet-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/wallet beam-wallet-testnet beam-wallet.cfg - tar -cvzf wallet-api-testnet-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/wallet wallet-api-testnet wallet-api.cfg + - tar -cvzf explorer-node-testnet-$BEAM_VERSION.tar.gz --directory=$HOME/build/BeamMW/beam/explorer explorer-node-testnet explorer-node.cfg # prep for deploy to AWS S3 - cp $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_IN $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_OUT @@ -294,12 +295,14 @@ after_success: - curl --retry 3 --ftp-create-dirs -T beam-node-testnet-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - curl --retry 3 --ftp-create-dirs -T beam-wallet-cli-testnet-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - curl --retry 3 --ftp-create-dirs -T wallet-api-testnet-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ + - curl --retry 3 --ftp-create-dirs -T explorer-node-testnet-$BEAM_VERSION.tar.gz $BUILDS_SERVER_PATH/ - curl --retry 3 --ftp-create-dirs -T "$HOME/build/BeamMW/beam/$BEAM_WALLET_UI_IN" "$BUILDS_SERVER_PATH/$BEAM_WALLET_UI_OUT" # upload binaries to S3 - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" beam-node-testnet-$BEAM_VERSION.tar.gz - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" beam-wallet-cli-testnet-$BEAM_VERSION.tar.gz - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" wallet-api-testnet-$BEAM_VERSION.tar.gz + - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" explorer-node-testnet-$BEAM_VERSION.tar.gz - artifacts upload --target-paths "$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$BUILD_TYPE/$OS_FOLDER/" $HOME/build/BeamMW/beam/$BEAM_WALLET_UI_OUT notifications: diff --git a/CMakeLists.txt b/CMakeLists.txt index 20f0d7428..9adf79e2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.1) -set(VERSION_MAJOR 1) -set(VERSION_MINOR 2) +set(VERSION_MAJOR 2) +set(VERSION_MINOR 0) set(VERSION_REVISION 0) set(GIT_COMMIT_HASH "unknown") diff --git a/appveyor.yml b/appveyor.yml index 1594aabb3..0816ca0bd 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -39,6 +39,8 @@ after_build: 7z a c:/projects/beam/beam/%BUILD_CONFIG%/beam-wallet-cli-testnet-%BEAM_VERSION%.zip c:/projects/beam/wallet/%BUILD_CONFIG%/beam-wallet-testnet.exe c:/projects/beam/wallet/beam-wallet.cfg 7z a c:/projects/beam/beam/%BUILD_CONFIG%/wallet-api-testnet-%BEAM_VERSION%.zip c:/projects/beam/wallet/%BUILD_CONFIG%/wallet-api-testnet.exe c:/projects/beam/wallet/wallet-api.cfg + + 7z a c:/projects/beam/beam/%BUILD_CONFIG%/explorer-node-testnet-%BEAM_VERSION%.zip c:/projects/beam/explorer/%BUILD_CONFIG%/explorer-node-testnet.exe c:/projects/beam/explorer/explorer-node.cfg mkdir pdb @@ -50,6 +52,8 @@ after_build: copy c:\projects\beam\beam\%BUILD_CONFIG%\wallet-api-testnet-%BEAM_VERSION%.zip c:\projects\beam\wallet-api-testnet-%BEAM_VERSION%.zip + copy c:\projects\beam\beam\%BUILD_CONFIG%\explorer-node-testnet-%BEAM_VERSION%.zip c:\projects\beam\explorer-node-testnet-%BEAM_VERSION%.zip + copy c:\projects\beam\beam\beam-pdb-testnet-%BEAM_VERSION%.zip c:\projects\beam\pdb\beam-pdb-testnet-%BEAM_VERSION%.zip copy c:\projects\beam\BeamWalletTestnet-%BEAM_VERSION%-win64.exe c:\projects\beam\Beam-Wallet-Testnet-%BEAM_VERSION%.exe @@ -66,8 +70,9 @@ on_success: curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/%BUILD_CONFIG%/wallet-api-testnet-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%/wallet-api-testnet-%BEAM_VERSION%.zip" - curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/BeamWalletTestnet-%BEAM_VERSION%-win64.exe" "%BUILDS_SERVER_PATH%/Beam-Wallet-Testnet-%BEAM_VERSION%.exe" + curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/%BUILD_CONFIG%/explorer-node-testnet-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%/explorer-node-testnet-%BEAM_VERSION%.zip" + curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/BeamWalletTestnet-%BEAM_VERSION%-win64.exe" "%BUILDS_SERVER_PATH%/Beam-Wallet-Testnet-%BEAM_VERSION%.exe" curl --retry 3 --ftp-create-dirs -T "c:/projects/beam/beam/beam-pdb-testnet-%BEAM_VERSION%.zip" "%BUILDS_SERVER_PATH%/pdb/beam-pdb-testnet-%BEAM_VERSION%.zip" @@ -81,6 +86,9 @@ artifacts: - path: wallet-api-testnet-%BEAM_VERSION%.zip name: BeamWalletApi + - path: explorer-node-testnet-%BEAM_VERSION%.zip + name: BeamNodeExplorer + - path: pdb/beam-pdb-testnet-%BEAM_VERSION%.zip name: BeamPdb @@ -98,7 +106,7 @@ deploy: unzip: false set_public: true folder: "%APPVEYOR_REPO_BRANCH%/%DATE%/Release/win/" - artifact: BeamPdb, BeamWalletApi, BeamWalletCli, BeamNode, BeamWallet + artifact: BeamPdb, BeamWalletApi, BeamNodeExplorer, BeamWalletCli, BeamNode, BeamWallet notifications: - provider: Email diff --git a/explorer/adapter.cpp b/explorer/adapter.cpp index 4a746bc2f..79b7f5ef2 100644 --- a/explorer/adapter.cpp +++ b/explorer/adapter.cpp @@ -141,7 +141,7 @@ class Adapter : public Node::IObserver, public IAdapter { void OnStateChanged() override { const auto& cursor = _nodeBackend.m_Cursor; - _cache.currentHeight = cursor.m_ID.m_Height; + _cache.currentHeight = cursor.m_Sid.m_Height; _cache.lowHorizon = cursor.m_LoHorizon; _statusDirty = true; if (_nextHook) _nextHook->OnStateChanged(); @@ -312,6 +312,12 @@ class Adapter : public Node::IObserver, public IAdapter { return true; } + if (_statusDirty) { + const auto &cursor = _nodeBackend.m_Cursor; + _cache.currentHeight = cursor.m_Sid.m_Height; + _cache.lowHorizon = cursor.m_LoHorizon; + } + io::SharedBuffer body; bool blockAvailable = (/*height >= _cache.lowHorizon && */height <= _cache.currentHeight); if (blockAvailable) { diff --git a/explorer/explorer-node.cfg b/explorer/explorer-node.cfg new file mode 100644 index 000000000..839ce3e2a --- /dev/null +++ b/explorer/explorer-node.cfg @@ -0,0 +1,21 @@ +################################################################################ +# Node explorer options: +################################################################################ + +# peer address +# peer= + +# port to start the local node on +# port=1000 + +# port to start the local api server on +# api_port=8888 + +# owner viewer key +# key_owner= + +# password for owner key +# pass= + +# IP whitelist (comma separated) +# ip_whitelist=127.0.0.1 diff --git a/explorer/explorer_node.cpp b/explorer/explorer_node.cpp index 4e91457a9..eedeceffd 100644 --- a/explorer/explorer_node.cpp +++ b/explorer/explorer_node.cpp @@ -3,19 +3,18 @@ #include "node/node.h" #include "utility/logger.h" #include "utility/helpers.h" +#include "utility/options.h" +#include "utility/string_helpers.h" +#include "wallet/secstring.h" +#include "core/ecc_native.h" #include #include "version.h" using namespace beam; using namespace std; -namespace po = boost::program_options; #define FILES_PREFIX "explorer-node_" -#define PEER_PARAMETER "peer" -#define PORT_PARAMETER "port" #define API_PORT_PARAMETER "api_port" -#define HELP_FULL_PARAMETER "help,h" -#define HELP_PARAMETER "help" struct Options { std::string nodeDbFilename; @@ -24,7 +23,9 @@ struct Options { io::Address nodeListenTo; io::Address explorerListenTo; int logLevel; + Key::IPKdf::Ptr ownerKey; static const unsigned logRotationPeriod = 3*60*60*1000; // 3 hours + std::vector whitelist; }; static bool parse_cmdline(int argc, char* argv[], Options& o); @@ -49,7 +50,7 @@ int main(int argc, char* argv[]) { setup_node(node, options); explorer::IAdapter::Ptr adapter = explorer::create_adapter(node); node.Initialize(); - explorer::Server server(*adapter, *reactor, options.explorerListenTo, options.accessControlFile); + explorer::Server server(*adapter, *reactor, options.explorerListenTo, options.accessControlFile, options.whitelist); LOG_INFO() << "Node listens to " << options.nodeListenTo << ", explorer listens to " << options.explorerListenTo; reactor->run(); LOG_INFO() << "Done"; @@ -71,10 +72,14 @@ bool parse_cmdline(int argc, char* argv[], Options& o) { po::options_description cliOptions("Node explorer options"); cliOptions.add_options() - (HELP_FULL_PARAMETER, "list of all options") - (PEER_PARAMETER, po::value()->default_value("172.104.249.212:8101"), "peer address") - (PORT_PARAMETER, po::value()->default_value(10000), "port to start the local node on") - (API_PORT_PARAMETER, po::value()->default_value(8888), "port to start the local api server on"); + (cli::HELP_FULL, "list of all options") + (cli::NODE_PEER, po::value()->default_value("eu-node03.masternet.beam.mw:8100"), "peer address") + (cli::PORT_FULL, po::value()->default_value(10000), "port to start the local node on") + (API_PORT_PARAMETER, po::value()->default_value(8888), "port to start the local api server on") + (cli::KEY_OWNER, po::value()->default_value(""), "owner viewer key") + (cli::PASS, po::value()->default_value(""), "password for owner key") + (cli::IP_WHITELIST, po::value()->default_value(""), "IP whitelist") + ; #ifdef NDEBUG o.logLevel = LOG_LEVEL_INFO; @@ -90,19 +95,74 @@ bool parse_cmdline(int argc, char* argv[], Options& o) { .options(cliOptions) .run(), vm); - if (vm.count(HELP_PARAMETER)) + if (vm.count(cli::HELP)) { cout << cliOptions << std::endl; return false; } + { + std::ifstream cfg("explorer-node.cfg"); + + if (cfg) + { + po::store(po::parse_config_file(cfg, cliOptions), vm); + } + } + + vm.notify(); + o.nodeDbFilename = FILES_PREFIX "db"; //o.accessControlFile = "api.keys"; - o.nodeConnectTo = vm[PEER_PARAMETER].as(); - o.nodeListenTo.port(vm[PORT_PARAMETER].as()); + o.nodeConnectTo = vm[cli::NODE_PEER].as(); + o.nodeListenTo.port(vm[cli::PORT].as()); o.explorerListenTo.port(vm[API_PORT_PARAMETER].as()); + std::string keyOwner = vm[cli::KEY_OWNER].as(); + if (!keyOwner.empty()) + { + SecString pass; + if (!beam::read_wallet_pass(pass, vm)) + throw std::runtime_error("Please, provide password for the keys."); + + KeyString ks; + ks.SetPassword(Blob(pass.data(), static_cast(pass.size()))); + + { + ks.m_sRes = keyOwner; + + std::shared_ptr kdf = std::make_shared(); + if (!ks.Import(*kdf)) + throw std::runtime_error("view key import failed"); + + o.ownerKey = kdf; + } + } + +#ifdef WIN32 + WSADATA wsaData = { }; + WSAStartup(MAKEWORD(2, 2), &wsaData); +#endif + + std::string whitelist = vm[cli::IP_WHITELIST].as(); + + if (!whitelist.empty()) + { + const auto& items = string_helpers::split(whitelist, ','); + + for (const auto& item : items) + { + io::Address addr; + + if (addr.resolve(item.c_str())) + { + o.whitelist.push_back(addr.ip()); + } + else throw std::runtime_error("IP address not added to whitelist: " + item); + } + } + return true; } catch (const po::error& ex) @@ -130,6 +190,8 @@ void setup_node(Node& node, const Options& o) { node.m_Cfg.m_VerificationThreads = 1; node.m_Cfg.m_Sync.m_NoFastSync = true; + node.m_Keys.m_pOwner = o.ownerKey; + auto& address = node.m_Cfg.m_Connect.emplace_back(); address.resolve(o.nodeConnectTo.c_str()); } \ No newline at end of file diff --git a/explorer/server.cpp b/explorer/server.cpp index 8aa331c7d..854baf43f 100644 --- a/explorer/server.cpp +++ b/explorer/server.cpp @@ -37,13 +37,14 @@ enum Dirs { } //namespace -Server::Server(IAdapter& adapter, io::Reactor& reactor, io::Address bindAddress, const std::string& keysFileName) : +Server::Server(IAdapter& adapter, io::Reactor& reactor, io::Address bindAddress, const std::string& keysFileName, const std::vector& whitelist) : _msgCreator(2000), _backend(adapter), _reactor(reactor), _timers(reactor, 100), _bindAddress(bindAddress), - _acl(keysFileName) //TODO + _acl(keysFileName), //TODO + _whitelist(whitelist) { _timers.set_timer(SERVER_RESTART_TIMER, 0, BIND_THIS_MEMFN(start_server)); _timers.set_timer(ACL_REFRESH_TIMER, ACL_REFRESH_INTERVAL, BIND_THIS_MEMFN(refresh_acl)); @@ -70,8 +71,19 @@ void Server::refresh_acl() { void Server::on_stream_accepted(io::TcpStream::Ptr&& newStream, io::ErrorCode errorCode) { if (errorCode == 0) { - newStream->enable_keepalive(1); + auto peer = newStream->peer_address(); + + if (!_whitelist.empty()) + { + if (std::find(_whitelist.begin(), _whitelist.end(), peer.ip()) == _whitelist.end()) + { + LOG_WARNING() << peer.str() << " not in IP whitelist, closing"; + return; + } + } + + newStream->enable_keepalive(1); LOG_DEBUG() << STS << "+peer " << peer; _connections[peer.u64()] = std::make_unique( peer.u64(), diff --git a/explorer/server.h b/explorer/server.h index fda5114da..dc2186a44 100644 --- a/explorer/server.h +++ b/explorer/server.h @@ -26,7 +26,7 @@ struct IAdapter; class Server { public: - Server(IAdapter& adapter, io::Reactor& reactor, io::Address bindAddress, const std::string& keysFileName); + Server(IAdapter& adapter, io::Reactor& reactor, io::Address bindAddress, const std::string& keysFileName, const std::vector& whitelist); private: class IPAccessControl { @@ -66,6 +66,7 @@ class Server { io::SerializedMsg _body; //AccessControl _acl; IPAccessControl _acl; + std::vector _whitelist; }; }} //namespaces diff --git a/utility/options.cpp b/utility/options.cpp index 436afb4cb..a7d3036fe 100644 --- a/utility/options.cpp +++ b/utility/options.cpp @@ -99,7 +99,15 @@ namespace beam const char* IMPORT_ADDRESSES = "import_addresses"; const char* IMPORT_EXPORT_PATH = "file_location"; const char* NO_FAST_SYNC = "no_fast_sync"; - const char* API_USE_HTTP = "api_use_http"; + const char* IP_WHITELIST = "ip_whitelist"; + + // wallet api + const char* API_USE_HTTP = "use_http"; + const char* API_USE_TLS = "use_tls"; + const char* API_TLS_CERT = "tls_cert"; + const char* API_TLS_KEY = "tls_key"; + const char* API_USE_ACL= "use_acl"; + const char* API_ACL_PATH = "acl_path"; // treasury const char* TR_OPCODE = "tr_op"; diff --git a/utility/options.h b/utility/options.h index 3d43f6de0..ddc35f4fa 100644 --- a/utility/options.h +++ b/utility/options.h @@ -98,7 +98,16 @@ namespace beam extern const char* IMPORT_ADDRESSES; extern const char* IMPORT_EXPORT_PATH; extern const char* NO_FAST_SYNC; + extern const char* IP_WHITELIST; + + // wallet api extern const char* API_USE_HTTP; + extern const char* API_USE_TLS; + extern const char* API_TLS_CERT; + extern const char* API_TLS_KEY; + extern const char* API_USE_ACL; + extern const char* API_ACL_PATH; + // treasury extern const char* TR_OPCODE; extern const char* TR_WID; diff --git a/wallet/api.cpp b/wallet/api.cpp index 3b39ab03c..66db5030f 100644 --- a/wallet/api.cpp +++ b/wallet/api.cpp @@ -50,11 +50,12 @@ namespace beam return std::string(data, data + (size > 1024 ? 1024 : size)); } - WalletApi::WalletApi(IWalletApiHandler& handler) + WalletApi::WalletApi(IWalletApiHandler& handler, ACL acl) : _handler(handler) + , _acl(acl) { -#define REG_FUNC(api, name) \ - _methods[name] = BIND_THIS_MEMFN(on##api##Message); +#define REG_FUNC(api, name, writeAccess) \ + _methods[name] = {BIND_THIS_MEMFN(on##api##Message), writeAccess}; WALLET_API_METHODS(REG_FUNC) @@ -75,10 +76,8 @@ namespace beam void WalletApi::onCreateAddressMessage(int id, const nlohmann::json& params) { checkJsonParam(params, "lifetime", id); - checkJsonParam(params, "metadata", id); CreateAddress createAddress; - createAddress.metadata = params["metadata"]; createAddress.lifetime = params["lifetime"]; if (params["lifetime"] < 0) @@ -225,6 +224,25 @@ namespace beam void WalletApi::onGetUtxoMessage(int id, const nlohmann::json& params) { GetUtxo getUtxo; + + if (existsJsonParam(params, "count")) + { + if (params["count"] > 0) + { + getUtxo.count = params["count"]; + } + else throw jsonrpc_exception{ INVALID_JSON_RPC , "Invalid 'count' parameter.", id }; + } + + if (existsJsonParam(params, "skip")) + { + if (params["skip"] >= 0) + { + getUtxo.skip = params["skip"]; + } + else throw jsonrpc_exception{ INVALID_JSON_RPC , "Invalid 'skip' parameter.", id }; + } + _handler.onMessage(id, getUtxo); } @@ -259,6 +277,24 @@ namespace beam } } + if (existsJsonParam(params, "count")) + { + if (params["count"] > 0) + { + txList.count = params["count"]; + } + else throw jsonrpc_exception{ INVALID_JSON_RPC , "Invalid 'count' parameter.", id }; + } + + if (existsJsonParam(params, "skip")) + { + if (params["skip"] >= 0) + { + txList.skip = params["skip"]; + } + else throw jsonrpc_exception{ INVALID_JSON_RPC , "Invalid 'skip' parameter.", id }; + } + _handler.onMessage(id, txList); } @@ -459,12 +495,26 @@ namespace beam if (msg["jsonrpc"] != "2.0") throwInvalidJsonRpc(); if (msg["id"] <= 0) throwInvalidJsonRpc(); + + if (_acl) + { + if (msg["key"] == nullptr) throw jsonrpc_exception{ INVALID_PARAMS_JSON_RPC , "API key not specified.", msg["id"] }; + if (_acl->count(msg["key"]) == 0) throw jsonrpc_exception{ UNKNOWN_API_KEY , "Unknown API key.", msg["id"] }; + } + if (msg["method"] == nullptr) throwInvalidJsonRpc(); if (_methods.find(msg["method"]) == _methods.end()) throwUnknownJsonRpc(msg["id"]); try { - _methods[msg["method"]](msg["id"], msg["params"] == nullptr ? json::object() : msg["params"]); + auto& info = _methods[msg["method"]]; + + if(_acl && info.writeAccess && _acl.get()[msg["key"]] == false) + { + throw jsonrpc_exception{ INVALID_PARAMS_JSON_RPC , "User doesn't have permissions to call this method.", msg["id"] }; + } + + info.func(msg["id"], msg["params"] == nullptr ? json::object() : msg["params"]); } catch (const nlohmann::detail::exception& e) { diff --git a/wallet/api.h b/wallet/api.h index ad96fda7b..185eaf437 100644 --- a/wallet/api.h +++ b/wallet/api.h @@ -24,28 +24,31 @@ #define INVALID_PARAMS_JSON_RPC -32602 #define INTERNAL_JSON_RPC_ERROR -32603 #define INVALID_TX_STATUS -32001 +#define UNKNOWN_API_KEY -32002 namespace beam { using json = nlohmann::json; +#define API_WRITE_ACCESS true +#define API_READ_ACCESS false + #define WALLET_API_METHODS(macro) \ - macro(CreateAddress, "create_address") \ - macro(ValidateAddress, "validate_address") \ - macro(Send, "tx_send") \ - macro(Replace, "replace") \ - macro(Status, "tx_status") \ - macro(Split, "tx_split") \ - macro(TxCancel, "tx_cancel") \ - macro(GetUtxo, "get_utxo") \ - macro(Lock, "lock") \ - macro(Unlock, "unlock") \ - macro(TxList, "tx_list") \ - macro(WalletStatus, "wallet_status") + macro(CreateAddress, "create_address", API_WRITE_ACCESS) \ + macro(ValidateAddress, "validate_address", API_READ_ACCESS) \ + macro(Send, "tx_send", API_WRITE_ACCESS) \ + macro(Replace, "replace", API_WRITE_ACCESS) \ + macro(Status, "tx_status", API_READ_ACCESS) \ + macro(Split, "tx_split", API_WRITE_ACCESS) \ + macro(TxCancel, "tx_cancel", API_WRITE_ACCESS) \ + macro(GetUtxo, "get_utxo", API_READ_ACCESS) \ + macro(Lock, "lock", API_WRITE_ACCESS) \ + macro(Unlock, "unlock", API_WRITE_ACCESS) \ + macro(TxList, "tx_list", API_READ_ACCESS) \ + macro(WalletStatus, "wallet_status", API_READ_ACCESS) struct CreateAddress { - std::string metadata; int lifetime; struct Response @@ -125,6 +128,9 @@ namespace beam struct GetUtxo { + int count = 0; + int skip = 0; + struct Response { std::vector utxos; @@ -155,6 +161,9 @@ namespace beam boost::optional height; } filter; + int count = 0; + int skip = 0; + struct Response { std::vector resultList; @@ -182,7 +191,7 @@ namespace beam public: virtual void onInvalidJsonRpc(const json& msg) = 0; -#define MESSAGE_FUNC(api, name) \ +#define MESSAGE_FUNC(api, name, _) \ virtual void onMessage(int id, const api& data) = 0; WALLET_API_METHODS(MESSAGE_FUNC) @@ -193,9 +202,13 @@ namespace beam class WalletApi { public: - WalletApi(IWalletApiHandler& handler); -#define RESPONSE_FUNC(api, name) \ + // user api key and read/write access + using ACL = boost::optional>; + + WalletApi(IWalletApiHandler& handler, ACL acl = boost::none); + +#define RESPONSE_FUNC(api, name, _) \ void getResponse(int id, const api::Response& data, json& msg); WALLET_API_METHODS(RESPONSE_FUNC) @@ -206,7 +219,7 @@ namespace beam private: -#define MESSAGE_FUNC(api, name) \ +#define MESSAGE_FUNC(api, name, _) \ void on##api##Message(int id, const json& msg); WALLET_API_METHODS(MESSAGE_FUNC) @@ -215,6 +228,14 @@ namespace beam private: IWalletApiHandler& _handler; - std::map> _methods; + + struct FuncInfo + { + std::function func; + bool writeAccess; + }; + + std::map _methods; + ACL _acl; }; } diff --git a/wallet/api_cli.cpp b/wallet/api_cli.cpp index fbc5a35b3..fb1246d44 100644 --- a/wallet/api_cli.cpp +++ b/wallet/api_cli.cpp @@ -19,14 +19,16 @@ #include #include +#include #include #include "utility/helpers.h" #include "utility/io/timer.h" #include "utility/io/tcpserver.h" +#include "utility/io/sslserver.h" #include "utility/io/json_serializer.h" -#include "utility/io/coarsetimer.h" #include "utility/options.h" +#include "utility/string_helpers.h" #include "http/http_connection.h" #include "http/http_msg_creator.h" @@ -43,10 +45,63 @@ using json = nlohmann::json; static const unsigned LOG_ROTATION_PERIOD = 3 * 60 * 60 * 1000; // 3 hours static const size_t PACKER_FRAGMENTS_SIZE = 4096; -static const uint64_t CLOSE_CONNECTION_TIMER = 1; namespace beam { + struct TlsOptions + { + bool use; + std::string certPath; + std::string keyPath; + }; + + WalletApi::ACL loadACL(const std::string& path) + { + std::ifstream file(path); + std::string line; + WalletApi::ACL::value_type keys; + int curLine = 1; + + while (std::getline(file, line)) + { + boost::algorithm::trim(line); + + auto key = string_helpers::split(line, ':'); + bool parsed = false; + + static const char* READ_ACCESS = "read"; + static const char* WRITE_ACCESS = "write"; + + if (key.size() == 2) + { + boost::algorithm::trim(key[0]); + boost::algorithm::trim(key[1]); + + parsed = !key[0].empty() && (key[1] == READ_ACCESS || key[1] == WRITE_ACCESS); + } + + if (!parsed) + { + LOG_ERROR() << "ACL parsing error, line " << curLine; + return boost::none; + } + + keys.insert({ key[0], key[1] == WRITE_ACCESS }); + curLine++; + } + + if (keys.empty()) + { + LOG_WARNING() << "ACL file is empty"; + } + else + { + LOG_INFO() << "ACL file successfully loaded"; + } + + return WalletApi::ACL(keys); + } + class IWalletApiServer { public: @@ -56,14 +111,17 @@ namespace beam class WalletApiServer : public IWalletApiServer { public: - WalletApiServer(IWalletDB::Ptr walletDB, Wallet& wallet, WalletNetworkViaBbs& wnet, io::Reactor& reactor, io::Address listenTo, bool useHttp) + WalletApiServer(IWalletDB::Ptr walletDB, Wallet& wallet, WalletNetworkViaBbs& wnet, io::Reactor& reactor, + io::Address listenTo, bool useHttp, WalletApi::ACL acl, const TlsOptions& tlsOptions, const std::vector& whitelist) : _reactor(reactor) , _bindAddress(listenTo) , _useHttp(useHttp) + , _tlsOptions(tlsOptions) , _walletDB(walletDB) , _wallet(wallet) , _wnet(wnet) - , _timers(_reactor, 100) + , _acl(acl) + , _whitelist(whitelist) { start(); } @@ -81,11 +139,10 @@ namespace beam try { - _server = io::TcpServer::create( - _reactor, - _bindAddress, - BIND_THIS_MEMFN(on_stream_accepted) - ); + _server = _tlsOptions.use + ? io::SslServer::create(_reactor, _bindAddress, BIND_THIS_MEMFN(on_stream_accepted), _tlsOptions.certPath.c_str(), _tlsOptions.keyPath.c_str()) + : io::TcpServer::create(_reactor, _bindAddress, BIND_THIS_MEMFN(on_stream_accepted)); + } catch (const std::exception& e) { @@ -101,8 +158,6 @@ namespace beam void closeConnection(uint64_t id) override { _pendingToClose.push_back(id); - - _timers.set_timer(1, 0, BIND_THIS_MEMFN(checkConnections)); } private: @@ -113,7 +168,7 @@ namespace beam { for (auto id : _pendingToClose) { - _connections.erase(id); + _connections.erase(id); } _pendingToClose.clear(); @@ -125,7 +180,7 @@ namespace beam template std::shared_ptr createConnection(io::TcpStream::Ptr&& newStream) { - return std::static_pointer_cast(std::make_shared(*this, _walletDB, _wallet, _wnet, std::move(newStream))); + return std::static_pointer_cast(std::make_shared(*this, _walletDB, _wallet, _wnet, std::move(newStream), _acl)); } void on_stream_accepted(io::TcpStream::Ptr&& newStream, io::ErrorCode errorCode) @@ -133,8 +188,20 @@ namespace beam if (errorCode == 0) { auto peer = newStream->peer_address(); + + if (!_whitelist.empty()) + { + if (std::find(_whitelist.begin(), _whitelist.end(), peer.ip()) == _whitelist.end()) + { + LOG_WARNING() << peer.str() << " not in IP whitelist, closing"; + return; + } + } + LOG_DEBUG() << "+peer " << peer; + checkConnections(); + _connections[peer.u64()] = _useHttp ? createConnection(std::move(newStream)) : createConnection(std::move(newStream)); @@ -147,10 +214,10 @@ namespace beam class ApiConnection : IWalletApiHandler, IWalletDbObserver { public: - ApiConnection(IWalletDB::Ptr walletDB, Wallet& wallet, WalletNetworkViaBbs& wnet) + ApiConnection(IWalletDB::Ptr walletDB, Wallet& wallet, WalletNetworkViaBbs& wnet, WalletApi::ACL acl) : _walletDB(walletDB) , _wallet(wallet) - , _api(*this) + , _api(*this, acl) , _wnet(wnet) { _walletDB->subscribe(this); @@ -207,7 +274,7 @@ namespace beam void onMessage(int id, const CreateAddress& data) override { - LOG_DEBUG() << "CreateAddress(id = " << id << " metadata = " << data.metadata << " lifetime = " << data.lifetime << ")"; + LOG_DEBUG() << "CreateAddress(id = " << id << " lifetime = " << data.lifetime << ")"; WalletAddress address = wallet::createAddress(*_walletDB); address.m_duration = data.lifetime * 60 * 60; @@ -225,7 +292,7 @@ namespace beam auto addr = _walletDB->getAddress(data.address); bool isMine = addr ? addr->m_OwnID != 0 : false; - doResponse(id, ValidateAddress::Response{ data.address.IsValid() && (isMine ? addr->isExpired() : true), isMine}); + doResponse(id, ValidateAddress::Response{ data.address.IsValid() && (isMine ? !addr->isExpired() : true), isMine}); } void onMessage(int id, const Send& data) override @@ -267,7 +334,7 @@ namespace beam ByteBuffer message(data.comment.begin(), data.comment.end()); - auto txId = _wallet.transfer_money(from, data.address, data.value, data.fee, true, 120, std::move(message)); + auto txId = _wallet.transfer_money(from, data.address, data.value, data.fee, true, 120, 720, std::move(message)); doResponse(id, Send::Response{ txId }); } catch(...) @@ -353,6 +420,25 @@ namespace beam } } + template + static void doPagination(size_t skip, size_t count, std::vector& res) + { + if (count > 0) + { + size_t start = skip; + size_t end = start + count; + size_t size = res.size(); + + if (start < size) + { + if (end > size) end = size; + + res = std::vector(res.begin() + start, res.begin() + end); + } + else res = {}; + } + } + void onMessage(int id, const GetUtxo& data) override { LOG_DEBUG() << "GetUtxo(id = " << id << ")"; @@ -364,6 +450,8 @@ namespace beam return true; }); + doPagination(data.skip, data.count, response.utxos); + doResponse(id, response); } @@ -435,10 +523,12 @@ namespace beam } } + using Result = decltype(res.resultList); + // filter transactions by status if provided if (data.filter.status) { - decltype(res.resultList) filteredList; + Result filteredList; for (const auto& it : res.resultList) if (it.tx.m_status == *data.filter.status) @@ -450,7 +540,7 @@ namespace beam // filter transactions by height if provided if (data.filter.height) { - decltype(res.resultList) filteredList; + Result filteredList; for (const auto& it : res.resultList) if (it.kernelProofHeight == *data.filter.height) @@ -459,8 +549,11 @@ namespace beam res.resultList = filteredList; } + doPagination(data.skip, data.count, res.resultList); + doResponse(id, res); } + private: void methodNotImplementedYet(int id) { @@ -477,8 +570,8 @@ namespace beam class TcpApiConnection : public ApiConnection { public: - TcpApiConnection(IWalletApiServer& server, IWalletDB::Ptr walletDB, Wallet& wallet, WalletNetworkViaBbs& wnet, io::TcpStream::Ptr&& newStream) - : ApiConnection(walletDB, wallet, wnet) + TcpApiConnection(IWalletApiServer& server, IWalletDB::Ptr walletDB, Wallet& wallet, WalletNetworkViaBbs& wnet, io::TcpStream::Ptr&& newStream, WalletApi::ACL acl) + : ApiConnection(walletDB, wallet, wnet, acl) , _stream(std::move(newStream)) , _lineProtocol(BIND_THIS_MEMFN(on_raw_message), BIND_THIS_MEMFN(on_write)) , _server(server) @@ -537,8 +630,8 @@ namespace beam class HttpApiConnection : public ApiConnection { public: - HttpApiConnection(IWalletApiServer& server, IWalletDB::Ptr walletDB, Wallet& wallet, WalletNetworkViaBbs& wnet, io::TcpStream::Ptr&& newStream) - : ApiConnection(walletDB, wallet, wnet) + HttpApiConnection(IWalletApiServer& server, IWalletDB::Ptr walletDB, Wallet& wallet, WalletNetworkViaBbs& wnet, io::TcpStream::Ptr&& newStream, WalletApi::ACL acl) + : ApiConnection(walletDB, wallet, wnet, acl) , _keepalive(false) , _msgCreator(2000) , _packer(PACKER_FRAGMENTS_SIZE) @@ -650,14 +743,16 @@ namespace beam io::TcpServer::Ptr _server; io::Address _bindAddress; bool _useHttp; + TlsOptions _tlsOptions; std::map> _connections; IWalletDB::Ptr _walletDB; Wallet& _wallet; WalletNetworkViaBbs& _wnet; - io::MultipleTimers _timers; std::vector _pendingToClose; + WalletApi::ACL _acl; + std::vector _whitelist; }; } @@ -677,14 +772,23 @@ int main(int argc, char* argv[]) std::string walletPath; std::string nodeURI; bool useHttp; + + bool useAcl; + std::string aclPath; + std::string whitelist; + } options; + TlsOptions tlsOptions; + io::Address node_addr; IWalletDB::Ptr walletDB; io::Reactor::Ptr reactor = io::Reactor::create(); + WalletApi::ACL acl; + std::vector whitelist; { - po::options_description desc("Wallet API options"); + po::options_description desc("Wallet API general options"); desc.add_options() (cli::HELP_FULL, "list of all options") (cli::PORT_FULL, po::value(&options.port)->default_value(10000), "port to start server on") @@ -692,8 +796,25 @@ int main(int argc, char* argv[]) (cli::WALLET_STORAGE, po::value(&options.walletPath)->default_value("wallet.db"), "path to wallet file") (cli::PASS, po::value(), "password for the wallet") (cli::API_USE_HTTP, po::value(&options.useHttp)->default_value(false), "use JSON RPC over HTTP") + (cli::IP_WHITELIST, po::value(&options.whitelist)->default_value(""), "IP whitelist") ; + po::options_description authDesc("User authorization options"); + authDesc.add_options() + (cli::API_USE_ACL, po::value(&options.useAcl)->default_value(false), "use Access Control List (ACL)") + (cli::API_ACL_PATH, po::value(&options.aclPath)->default_value("wallet_api.acl"), "path to ACL file") + ; + + po::options_description tlsDesc("TLS protocol options"); + tlsDesc.add_options() + (cli::API_USE_TLS, po::value(&tlsOptions.use)->default_value(false), "use TLS protocol") + (cli::API_TLS_CERT, po::value(&tlsOptions.certPath)->default_value("wallet_api.crt"), "path to TLS certificate") + (cli::API_TLS_KEY, po::value(&tlsOptions.keyPath)->default_value("wallet_api.key"), "path to TLS private key") + ; + + desc.add(authDesc); + desc.add(tlsDesc); + po::variables_map vm; po::store(po::command_line_parser(argc, argv) @@ -720,6 +841,50 @@ int main(int argc, char* argv[]) Rules::get().UpdateChecksum(); LOG_INFO() << "Beam Wallet API " << PROJECT_VERSION << " (" << BRANCH_NAME << ")"; LOG_INFO() << "Rules signature: " << Rules::get().Checksum; + + if (options.useAcl) + { + if (!(boost::filesystem::exists(options.aclPath) && (acl = loadACL(options.aclPath)))) + { + LOG_ERROR() << "ACL file not loaded, path is: " << options.aclPath; + return -1; + } + } + + if (tlsOptions.use) + { + if (tlsOptions.certPath.empty() || !boost::filesystem::exists(tlsOptions.certPath)) + { + LOG_ERROR() << "TLS certificate not found, path is: " << tlsOptions.certPath; + return -1; + } + + if (tlsOptions.keyPath.empty() || !boost::filesystem::exists(tlsOptions.keyPath)) + { + LOG_ERROR() << "TLS private key not found, path is: " << tlsOptions.keyPath; + return -1; + } + } + + if (!options.whitelist.empty()) + { + const auto& items = string_helpers::split(options.whitelist, ','); + + for (const auto& item : items) + { + io::Address addr; + + if (addr.resolve(item.c_str())) + { + whitelist.push_back(addr.ip()); + } + else + { + LOG_ERROR() << "IP address not added to whitelist: " << item; + return -1; + } + } + } if (vm.count(cli::NODE_ADDR) == 0) { @@ -766,7 +931,6 @@ int main(int argc, char* argv[]) Logger::get()->rotate(); }); - Wallet wallet{ walletDB }; proto::FlyClient::NetworkStd nnet(wallet); @@ -777,7 +941,8 @@ int main(int argc, char* argv[]) wallet.set_Network(nnet, wnet); - WalletApiServer server(walletDB, wallet, wnet, *reactor, listenTo, options.useHttp); + WalletApiServer server(walletDB, wallet, wnet, *reactor, + listenTo, options.useHttp, acl, tlsOptions, whitelist); io::Reactor::get_Current().run(); diff --git a/wallet/unittests/wallet_api_test.cpp b/wallet/unittests/wallet_api_test.cpp index d005d363c..5c07bdeb1 100644 --- a/wallet/unittests/wallet_api_test.cpp +++ b/wallet/unittests/wallet_api_test.cpp @@ -68,7 +68,7 @@ namespace { void onInvalidJsonRpc(const json& msg) override {} -#define MESSAGE_FUNC(strct, name) virtual void onMessage(int id, const strct& data) override {}; +#define MESSAGE_FUNC(strct, name, _) virtual void onMessage(int id, const strct& data) override {}; WALLET_API_METHODS(MESSAGE_FUNC) #undef MESSAGE_FUNC }; @@ -111,7 +111,6 @@ namespace void onMessage(int id, const CreateAddress& data) override { WALLET_CHECK(id > 0); - WALLET_CHECK(data.metadata == "custom user data"); } }; @@ -384,6 +383,34 @@ namespace } } + void testTxListPaginationJsonRpc(const std::string& msg) + { + class WalletApiHandler : public WalletApiHandlerBase + { + public: + + void onInvalidJsonRpc(const json& msg) override + { + WALLET_CHECK(!"invalid list api json!!!"); + + cout << msg["error"]["message"] << endl; + } + + void onMessage(int id, const TxList& data) override + { + WALLET_CHECK(id > 0); + + WALLET_CHECK(data.skip == 10); + WALLET_CHECK(data.count == 10); + } + }; + + WalletApiHandler handler; + WalletApi api(handler); + + WALLET_CHECK(api.parse(msg.data(), msg.size())); + } + void testValidateAddressJsonRpc(const std::string& msg, bool valid) { class WalletApiHandler : public WalletApiHandlerBase @@ -596,6 +623,18 @@ int main() } })); + testTxListPaginationJsonRpc(JSON_CODE( + { + "jsonrpc": "2.0", + "id" : 12345, + "method" : "tx_list", + "params" : + { + "skip" : 10, + "count" : 10 + } + })); + testValidateAddressJsonRpc(JSON_CODE( { "jsonrpc": "2.0", diff --git a/wallet/wallet-api.cfg b/wallet/wallet-api.cfg index 0f03aef21..3354dc63c 100644 --- a/wallet/wallet-api.cfg +++ b/wallet/wallet-api.cfg @@ -1,5 +1,5 @@ ################################################################################ -# Wallet API options: +# Wallet API genaral options: ################################################################################ # password for the wallet @@ -13,3 +13,32 @@ # port to start server on # port=10000 + +# use JSON RPC over HTTP +# use_http=0 + +# IP whitelist (comma separated) +# ip_whitelist=127.0.0.1,... + +################################################################################ +# User authorization options: +################################################################################ + +# use Access Control List (ACL) +# use_acl=0 + +# path to ACL file +# acl_path=wallet_api.acl + +################################################################################ +# TLS protocol options: +################################################################################ + +# use TLS protocol +# use_tls=0 + +# path to TLS certificate +# tls_cert=wallet_api.crt + +# path to TLS private key +# tls_key=wallet_api.key diff --git a/wallet/wallet.cpp b/wallet/wallet.cpp index 4debe271c..16a1c0999 100644 --- a/wallet/wallet.cpp +++ b/wallet/wallet.cpp @@ -236,17 +236,17 @@ namespace beam #undef THE_MACRO } - TxID Wallet::transfer_money(const WalletID& from, const WalletID& to, Amount amount, Amount fee, bool sender, Height lifetime, ByteBuffer&& message) + TxID Wallet::transfer_money(const WalletID& from, const WalletID& to, Amount amount, Amount fee, bool sender, Height lifetime, Height responseTime, ByteBuffer&& message) { - return transfer_money(from, to, AmountList{ amount }, fee, {}, sender, lifetime, move(message)); + return transfer_money(from, to, AmountList{ amount }, fee, {}, sender, lifetime, responseTime, move(message)); } - TxID Wallet::transfer_money(const WalletID& from, const WalletID& to, Amount amount, Amount fee, const CoinIDList& coins, bool sender, Height lifetime, ByteBuffer&& message) + TxID Wallet::transfer_money(const WalletID& from, const WalletID& to, Amount amount, Amount fee, const CoinIDList& coins, bool sender, Height lifetime, Height responseTime, ByteBuffer&& message) { - return transfer_money(from, to, AmountList{ amount }, fee, coins, sender, lifetime, move(message)); + return transfer_money(from, to, AmountList{ amount }, fee, coins, sender, lifetime, responseTime, move(message)); } - TxID Wallet::transfer_money(const WalletID& from, const WalletID& to, const AmountList& amountList, Amount fee, const CoinIDList& coins, bool sender, Height lifetime, ByteBuffer&& message) + TxID Wallet::transfer_money(const WalletID& from, const WalletID& to, const AmountList& amountList, Amount fee, const CoinIDList& coins, bool sender, Height lifetime, Height responseTime, ByteBuffer&& message) { auto receiverAddr = m_WalletDB->getAddress(to); @@ -291,9 +291,9 @@ namespace beam return txID; } - TxID Wallet::split_coins(const WalletID& from, const AmountList& amountList, Amount fee, bool sender, Height lifetime, ByteBuffer&& message) + TxID Wallet::split_coins(const WalletID& from, const AmountList& amountList, Amount fee, bool sender, Height lifetime, Height responseTime, ByteBuffer&& message) { - return transfer_money(from, from, amountList, fee, {}, sender, lifetime, move(message)); + return transfer_money(from, from, amountList, fee, {}, sender, lifetime, responseTime, move(message)); } TxID Wallet::swap_coins(const WalletID& from, const WalletID& to, Amount amount, Amount fee, wallet::AtomicSwapCoin swapCoin, Amount swapAmount) diff --git a/wallet/wallet.h b/wallet/wallet.h index 1790e3f19..ea80d3f60 100644 --- a/wallet/wallet.h +++ b/wallet/wallet.h @@ -72,10 +72,10 @@ namespace beam void set_Network(proto::FlyClient::INetwork&, IWalletNetwork&); - TxID transfer_money(const WalletID& from, const WalletID& to, Amount amount, Amount fee = 0, bool sender = true, Height lifetime = 120, ByteBuffer&& message = {} ); - TxID transfer_money(const WalletID& from, const WalletID& to, Amount amount, Amount fee = 0, const CoinIDList& coins = {}, bool sender = true, Height lifetime = 120, ByteBuffer&& message = {}); - TxID transfer_money(const WalletID& from, const WalletID& to, const AmountList& amountList, Amount fee = 0, const CoinIDList& coins = {}, bool sender = true, Height lifetime = 120, ByteBuffer&& message = {}); - TxID split_coins(const WalletID& from, const AmountList& amountList, Amount fee = 0, bool sender = true, Height lifetime = 120, ByteBuffer&& message = {}); + TxID transfer_money(const WalletID& from, const WalletID& to, Amount amount, Amount fee = 0, bool sender = true, Height lifetime = 120, Height responseTime = 12*60, ByteBuffer&& message = {} ); + TxID transfer_money(const WalletID& from, const WalletID& to, Amount amount, Amount fee = 0, const CoinIDList& coins = {}, bool sender = true, Height lifetime = 120, Height responseTime = 12 * 60, ByteBuffer&& message = {}); + TxID transfer_money(const WalletID& from, const WalletID& to, const AmountList& amountList, Amount fee = 0, const CoinIDList& coins = {}, bool sender = true, Height lifetime = 120, Height responseTime = 12 * 60, ByteBuffer&& message = {}); + TxID split_coins(const WalletID& from, const AmountList& amountList, Amount fee = 0, bool sender = true, Height lifetime = 120, Height responseTime = 12 * 60, ByteBuffer&& message = {}); TxID swap_coins(const WalletID& from, const WalletID& to, Amount amount, Amount fee, wallet::AtomicSwapCoin swapCoin, Amount swapAmount); void Refresh(); diff --git a/wallet/wallet_client.cpp b/wallet/wallet_client.cpp index 7a5ffa6f5..5183ef60a 100644 --- a/wallet/wallet_client.cpp +++ b/wallet/wallet_client.cpp @@ -373,7 +373,7 @@ void WalletClient::sendMoney(const beam::WalletID& receiver, const std::string& auto s = m_wallet.lock(); if (s) { - s->transfer_money(senderAddress.m_walletID, receiver, move(amount), move(fee), true, 120, move(message)); + s->transfer_money(senderAddress.m_walletID, receiver, move(amount), move(fee), true, 120, 720, move(message)); } onSendMoneyVerified(); From e4d50367b26edc615484adaf69107b31bccf6246 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Thu, 28 Feb 2019 15:56:50 +0300 Subject: [PATCH 030/136] #42 implemented wrapper about saveAddressChnages for android # Conflicts: # android/jni.cpp --- .../beam/beamwallet/core/entities/Wallet.java | 1 + android/jni.cpp | 40 +++++++------------ 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/android/com/mw/beam/beamwallet/core/entities/Wallet.java b/android/com/mw/beam/beamwallet/core/entities/Wallet.java index 463d26efc..8406fb5ef 100644 --- a/android/com/mw/beam/beamwallet/core/entities/Wallet.java +++ b/android/com/mw/beam/beamwallet/core/entities/Wallet.java @@ -30,6 +30,7 @@ public class Wallet public native void getAddresses(boolean own); public native void generateNewAddress(); public native void saveAddress(WalletAddressDTO address, boolean own); + public native void saveAddressChanges(String addr, String name, boolean isNever, boolean makeActive, boolean makeExpired); public native void cancelTx(String id); public native void deleteTx(String id); public native void deleteAddress(String walletID); diff --git a/android/jni.cpp b/android/jni.cpp index 131fa790a..75a02708c 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -69,9 +69,6 @@ namespace using WalletSubscriber = ScopedSubscriber; - // this code for node - //static unique_ptr nodeModel; - static unique_ptr walletModel; void initLogger(const string& appData) @@ -125,15 +122,6 @@ JNIEXPORT jobject JNICALL BEAM_JAVA_API_INTERFACE(createWallet)(JNIEnv *env, job { LOG_DEBUG() << "wallet successfully created."; - // this code for node - /*LOG_DEBUG() << "try to start node"; - - nodeModel = make_unique(appData); - - nodeModel->setKdf(walletDB->get_MasterKdf()); - nodeModel->startNode(); - walletModel = make_unique(walletDB, "127.0.0.1:10005");*/ - walletModel = make_unique(walletDB, JString(env, nodeAddrStr).value()); jobject walletObj = env->AllocObject(WalletClass); @@ -172,19 +160,6 @@ JNIEXPORT jobject JNICALL BEAM_JAVA_API_INTERFACE(openWallet)(JNIEnv *env, jobje { LOG_DEBUG() << "wallet successfully opened."; - // this code for node - /*LOG_DEBUG() << "try to start node"; - - nodeModel = make_unique(appData); - - nodeModel->start(); - - nodeModel->setKdf(walletDB->get_MasterKdf()); - - nodeModel->startNode(); - - walletModel = make_unique(walletDB, "127.0.0.1:10005");*/ - walletModel = make_unique(walletDB, JString(env, nodeAddrStr).value()); jobject walletObj = env->AllocObject(WalletClass); @@ -299,6 +274,21 @@ JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(saveAddress)(JNIEnv *env, jobj walletModel->getAsync()->saveAddress(addr, own); } +JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(saveAddressChanges)(JNIEnv *env, jobject thiz, + jstring addr, jstring name, jboolean isNever, jboolean makeActive, jboolean makeExpired) +{ + WalletID walletID(Zero); + + if (!walletID.FromHex(JString(env, addr).value())) + { + LOG_ERROR() << "Address is not valid!!!"; + + return; + } + walletModel->getAsync()->saveAddressChanges(walletID, JString(env, name).value(), isNever, makeActive, makeExpired); +} + +// don't use it. i don't check it JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(cancelTx)(JNIEnv *env, jobject thiz, jstring txId) { From 54efaf438c599933ed608bd2f0f5d7cb2afa20ed Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Fri, 1 Mar 2019 15:48:24 +0300 Subject: [PATCH 031/136] #122 implemented new functions for android: isWalletRan and closeWallet --- android/com/mw/beam/beamwallet/core/Api.java | 2 ++ android/jni.cpp | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/android/com/mw/beam/beamwallet/core/Api.java b/android/com/mw/beam/beamwallet/core/Api.java index 5d8347850..9f6dc3c12 100644 --- a/android/com/mw/beam/beamwallet/core/Api.java +++ b/android/com/mw/beam/beamwallet/core/Api.java @@ -19,6 +19,8 @@ public class Api { public native boolean isWalletInitialized(String path); + public native void closeWallet(); + public native boolean isWalletRan(); public native Wallet createWallet(String nodeAddr, String path, String pass, String phrases); public native Wallet openWallet(String nodeAddr, String path, String pass); public native String[] createMnemonic(); diff --git a/android/jni.cpp b/android/jni.cpp index 75a02708c..39ba1d84b 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -144,6 +144,21 @@ JNIEXPORT jboolean JNICALL BEAM_JAVA_API_INTERFACE(isWalletInitialized)(JNIEnv * return WalletDB::isInitialized(JString(env, appData).value() + "/" WALLET_FILENAME) ? JNI_TRUE : JNI_FALSE; } +JNIEXPORT void JNICALL BEAM_JAVA_API_INTERFACE(closeWallet)(JNIEnv *env, jobject thiz) +{ + LOG_DEBUG() << "close wallet if it exists"; + + if (walletModel) + { + walletModel.reset(); + } +} + +JNIEXPORT jboolean JNICALL BEAM_JAVA_API_INTERFACE(isWalletRan)(JNIEnv *env, jobject thiz) +{ + return walletModel != nullptr; +} + JNIEXPORT jobject JNICALL BEAM_JAVA_API_INTERFACE(openWallet)(JNIEnv *env, jobject thiz, jstring nodeAddrStr, jstring appDataStr, jstring passStr) { @@ -161,7 +176,7 @@ JNIEXPORT jobject JNICALL BEAM_JAVA_API_INTERFACE(openWallet)(JNIEnv *env, jobje LOG_DEBUG() << "wallet successfully opened."; walletModel = make_unique(walletDB, JString(env, nodeAddrStr).value()); - + jobject walletObj = env->AllocObject(WalletClass); walletModel->start(); From 2d5a99acfb10f854ac99853d581f12e4ecd7a4e1 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Fri, 1 Mar 2019 15:50:32 +0300 Subject: [PATCH 032/136] #122 renamed function --- android/com/mw/beam/beamwallet/core/Api.java | 2 +- android/jni.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/com/mw/beam/beamwallet/core/Api.java b/android/com/mw/beam/beamwallet/core/Api.java index 9f6dc3c12..91944a8ec 100644 --- a/android/com/mw/beam/beamwallet/core/Api.java +++ b/android/com/mw/beam/beamwallet/core/Api.java @@ -20,7 +20,7 @@ public class Api { public native boolean isWalletInitialized(String path); public native void closeWallet(); - public native boolean isWalletRan(); + public native boolean isWalletRunning(); public native Wallet createWallet(String nodeAddr, String path, String pass, String phrases); public native Wallet openWallet(String nodeAddr, String path, String pass); public native String[] createMnemonic(); diff --git a/android/jni.cpp b/android/jni.cpp index 39ba1d84b..c39649369 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -154,7 +154,7 @@ JNIEXPORT void JNICALL BEAM_JAVA_API_INTERFACE(closeWallet)(JNIEnv *env, jobject } } -JNIEXPORT jboolean JNICALL BEAM_JAVA_API_INTERFACE(isWalletRan)(JNIEnv *env, jobject thiz) +JNIEXPORT jboolean JNICALL BEAM_JAVA_API_INTERFACE(isWalletRunning)(JNIEnv *env, jobject thiz) { return walletModel != nullptr; } From 1895c724408abc4c4ab6170216a81acb62e84c8f Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Mon, 4 Mar 2019 15:14:30 +0300 Subject: [PATCH 033/136] #122 fixed crash after relogin to wallet --- android/common.cpp | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/android/common.cpp b/android/common.cpp index 14753d92a..6fdb19be7 100644 --- a/android/common.cpp +++ b/android/common.cpp @@ -24,14 +24,38 @@ jclass TxDescriptionClass = 0; jclass UtxoClass = 0; jclass WalletAddressClass = 0; -JNIEnv* Android_JNI_getEnv(void) +namespace { - JNIEnv *env; + class ThreadJNIEnv + { + public: + + ThreadJNIEnv() + { #if defined (__ANDROID__) - JVM->AttachCurrentThread(&env, NULL); + JVM->AttachCurrentThread(&m_env, NULL); #else - JVM->AttachCurrentThread((void**)&env, NULL); + JVM->AttachCurrentThread((void**)&m_env, NULL); #endif + } + + ~ThreadJNIEnv() + { + JVM->DetachCurrentThread(); + } + + JNIEnv* get() const + { + return m_env; + } - return env; + private: + JNIEnv* m_env; + }; +} + +JNIEnv* Android_JNI_getEnv(void) +{ + static thread_local ThreadJNIEnv env; + return env.get(); } \ No newline at end of file From 5e8d6607cdcb57d74436829914192792170f987f Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Wed, 6 Mar 2019 09:05:48 +0300 Subject: [PATCH 034/136] #127 create default address in time wallet creating --- android/jni.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/android/jni.cpp b/android/jni.cpp index c39649369..e2482755b 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -122,6 +122,12 @@ JNIEXPORT jobject JNICALL BEAM_JAVA_API_INTERFACE(createWallet)(JNIEnv *env, job { LOG_DEBUG() << "wallet successfully created."; + // generate default address + + WalletAddress address = wallet::createAddress(*walletDB); + address.m_label = "default"; + walletDB->saveAddress(address); + walletModel = make_unique(walletDB, JString(env, nodeAddrStr).value()); jobject walletObj = env->AllocObject(WalletClass); From f91d9a6128c8f70edaa6f54886efcf30adbb08b3 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Thu, 7 Mar 2019 12:11:42 +0300 Subject: [PATCH 035/136] #74 added our prebuilt of boost for android --- .travis.yml | 8 ++++---- CMakeLists.txt | 2 +- utility/CMakeLists.txt | 24 ++++++++++++------------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index b3c6e78db..c7287172c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -148,7 +148,7 @@ matrix: - echo y | sdkmanager "ndk-bundle" - wget "https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.sh" - sudo sh cmake-3.12.0-Linux-x86_64.sh --skip-license --prefix=/usr - - sudo git clone --depth=1 https://github.com/nesbox/boost_1_68-android.git /usr/local/boost_1_68-android + - sudo git clone --depth=1 https://github.com/BeamMW/boost-android.git /usr/local/boost_1_68-android - sudo git clone --depth=1 https://github.com/nesbox/Prebuilt-OpenSSL-Android.git /usr/local/Prebuilt-OpenSSL-Android - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android @@ -185,7 +185,7 @@ matrix: - echo y | sdkmanager "ndk-bundle" - wget "https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.sh" - sudo sh cmake-3.12.0-Linux-x86_64.sh --skip-license --prefix=/usr - - sudo git clone --depth=1 https://github.com/nesbox/boost_1_68-android.git /usr/local/boost_1_68-android + - sudo git clone --depth=1 https://github.com/BeamMW/boost-android.git /usr/local/boost_1_68-android - sudo git clone --depth=1 https://github.com/nesbox/Prebuilt-OpenSSL-Android.git /usr/local/Prebuilt-OpenSSL-Android - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android @@ -219,7 +219,7 @@ matrix: - echo y | sdkmanager "ndk-bundle" - wget "https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.sh" - sudo sh cmake-3.12.0-Linux-x86_64.sh --skip-license --prefix=/usr - - sudo git clone --depth=1 https://github.com/nesbox/boost_1_68-android.git /usr/local/boost_1_68-android + - sudo git clone --depth=1 https://github.com/BeamMW/boost-android.git /usr/local/boost_1_68-android - sudo git clone --depth=1 https://github.com/nesbox/Prebuilt-OpenSSL-Android.git /usr/local/Prebuilt-OpenSSL-Android - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android @@ -256,7 +256,7 @@ matrix: - echo y | sdkmanager "ndk-bundle" - wget "https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.sh" - sudo sh cmake-3.12.0-Linux-x86_64.sh --skip-license --prefix=/usr - - sudo git clone --depth=1 https://github.com/nesbox/boost_1_68-android.git /usr/local/boost_1_68-android + - sudo git clone --depth=1 https://github.com/BeamMW/boost-android.git /usr/local/boost_1_68-android - sudo git clone --depth=1 https://github.com/nesbox/Prebuilt-OpenSSL-Android.git /usr/local/Prebuilt-OpenSSL-Android - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android diff --git a/CMakeLists.txt b/CMakeLists.txt index 9adf79e2b..e7d749cbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -201,7 +201,7 @@ link_directories($ENV{BOOST_ROOT}/lib) if(ANDROID) message("ANDROID_ABI: ${ANDROID_ABI}") add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) - include_directories($ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/include/boost-1_68) + include_directories($ENV{BOOST_ROOT_ANDROID}/include) if(ANDROID_ABI STREQUAL "armeabi-v7a") set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/armv7-shared) diff --git a/utility/CMakeLists.txt b/utility/CMakeLists.txt index 523a642b7..25249e1b9 100644 --- a/utility/CMakeLists.txt +++ b/utility/CMakeLists.txt @@ -70,24 +70,24 @@ target_link_libraries(utility mnemonic) if(ANDROID) if(ANDROID_ABI STREQUAL "armeabi-v7a") target_link_libraries(utility - $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_program_options-clang-mt-a32-1_68.a - $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_filesystem-clang-mt-a32-1_68.a - $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_system-clang-mt-a32-1_68.a) + $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-a32-1_68.a + $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_filesystem-clang-mt-a32-1_68.a + $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_system-clang-mt-a32-1_68.a) elseif(ANDROID_ABI STREQUAL "x86") target_link_libraries(utility - $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_program_options-clang-mt-x32-1_68.a - $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_filesystem-clang-mt-x32-1_68.a - $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_system-clang-mt-x32-1_68.a) + $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-x32-1_68.a + $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_filesystem-clang-mt-x32-1_68.a + $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_system-clang-mt-x32-1_68.a) elseif(ANDROID_ABI STREQUAL "x86_64") target_link_libraries(utility - $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_program_options-clang-mt-x64-1_68.a - $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_filesystem-clang-mt-x64-1_68.a - $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_system-clang-mt-x64-1_68.a) + $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-x64-1_68.a + $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_filesystem-clang-mt-x64-1_68.a + $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_system-clang-mt-x64-1_68.a) elseif(ANDROID_ABI STREQUAL "arm64-v8a") target_link_libraries(utility - $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_program_options-clang-mt-a64-1_68.a - $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_filesystem-clang-mt-a64-1_68.a - $ENV{BOOST_ROOT_ANDROID}/${ANDROID_ABI}/lib/libboost_system-clang-mt-a64-1_68.a) + $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_program_options-clang-mt-a64-1_68.a + $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_filesystem-clang-mt-a64-1_68.a + $ENV{BOOST_ROOT_ANDROID}/libs/${ANDROID_ABI}/libboost_system-clang-mt-a64-1_68.a) endif() else() From 74d9fd7ed7e6de836fc087d77f17e9c4a2f77c07 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Thu, 7 Mar 2019 14:35:02 +0300 Subject: [PATCH 036/136] #74 openssl for android (our prebuilt) --- .travis.yml | 8 ++++---- CMakeLists.txt | 19 +++---------------- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/.travis.yml b/.travis.yml index c7287172c..bbdd2200e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -149,7 +149,7 @@ matrix: - wget "https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.sh" - sudo sh cmake-3.12.0-Linux-x86_64.sh --skip-license --prefix=/usr - sudo git clone --depth=1 https://github.com/BeamMW/boost-android.git /usr/local/boost_1_68-android - - sudo git clone --depth=1 https://github.com/nesbox/Prebuilt-OpenSSL-Android.git /usr/local/Prebuilt-OpenSSL-Android + - sudo git clone --depth=1 https://github.com/BeamMW/openssl-android.git /usr/local/Prebuilt-OpenSSL-Android - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android/Prebuilt @@ -186,7 +186,7 @@ matrix: - wget "https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.sh" - sudo sh cmake-3.12.0-Linux-x86_64.sh --skip-license --prefix=/usr - sudo git clone --depth=1 https://github.com/BeamMW/boost-android.git /usr/local/boost_1_68-android - - sudo git clone --depth=1 https://github.com/nesbox/Prebuilt-OpenSSL-Android.git /usr/local/Prebuilt-OpenSSL-Android + - sudo git clone --depth=1 https://github.com/BeamMW/openssl-android.git /usr/local/Prebuilt-OpenSSL-Android - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android/Prebuilt @@ -220,7 +220,7 @@ matrix: - wget "https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.sh" - sudo sh cmake-3.12.0-Linux-x86_64.sh --skip-license --prefix=/usr - sudo git clone --depth=1 https://github.com/BeamMW/boost-android.git /usr/local/boost_1_68-android - - sudo git clone --depth=1 https://github.com/nesbox/Prebuilt-OpenSSL-Android.git /usr/local/Prebuilt-OpenSSL-Android + - sudo git clone --depth=1 https://github.com/BeamMW/openssl-android.git /usr/local/Prebuilt-OpenSSL-Android - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android/Prebuilt @@ -257,7 +257,7 @@ matrix: - wget "https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.sh" - sudo sh cmake-3.12.0-Linux-x86_64.sh --skip-license --prefix=/usr - sudo git clone --depth=1 https://github.com/BeamMW/boost-android.git /usr/local/boost_1_68-android - - sudo git clone --depth=1 https://github.com/nesbox/Prebuilt-OpenSSL-Android.git /usr/local/Prebuilt-OpenSSL-Android + - sudo git clone --depth=1 https://github.com/BeamMW/openssl-android.git /usr/local/Prebuilt-OpenSSL-Android - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android/Prebuilt diff --git a/CMakeLists.txt b/CMakeLists.txt index e7d749cbe..49ef10697 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -202,19 +202,6 @@ if(ANDROID) message("ANDROID_ABI: ${ANDROID_ABI}") add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) include_directories($ENV{BOOST_ROOT_ANDROID}/include) - - if(ANDROID_ABI STREQUAL "armeabi-v7a") - set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/armv7-shared) - elseif(ANDROID_ABI STREQUAL "x86") - set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/x86-shared) - elseif(ANDROID_ABI STREQUAL "x86_64") - set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/x86_64-shared) - elseif(ANDROID_ABI STREQUAL "arm64-v8a") - set(OPENSSL_ROOT_DIR_ANDROID $ENV{OPENSSL_ROOT_DIR_ANDROID}/arm64-v8a-shared) - else() - message(FATAL_ERROR "error, ANDROID_ABI not defined.") - endif() - else() if(BEAM_USE_STATIC) include(FindBoost) @@ -280,9 +267,9 @@ if(BEAM_USE_STATIC) endif() else() if(ANDROID) - include_directories(${OPENSSL_ROOT_DIR_ANDROID}/include) - set(OPENSSL_LIBCRYPTO ${OPENSSL_ROOT_DIR_ANDROID}/lib/libcrypto.a) - set(OPENSSL_LIBSSL ${OPENSSL_ROOT_DIR_ANDROID}/lib/libssl.a) + include_directories($ENV{OPENSSL_ROOT_DIR_ANDROID}/include) + set(OPENSSL_LIBCRYPTO $ENV{OPENSSL_ROOT_DIR_ANDROID}/libs/${ANDROID_ABI}/libcrypto.a) + set(OPENSSL_LIBSSL $ENV{OPENSSL_ROOT_DIR_ANDROID}/libs/${ANDROID_ABI}/libssl.a) else() find_package(OpenSSL REQUIRED) From 7b38b6b47829044f05533f97f748e80b2b9b271d Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Thu, 7 Mar 2019 16:32:54 +0300 Subject: [PATCH 037/136] #74 fixed built problem with openssl --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index bbdd2200e..6c2f76e7c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -152,7 +152,7 @@ matrix: - sudo git clone --depth=1 https://github.com/BeamMW/openssl-android.git /usr/local/Prebuilt-OpenSSL-Android - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android - - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android/Prebuilt + - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android - export PATH=$ANDROID_NDK_HOME:$PATH script: - cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake -DANDROID_NATIVE_API_LEVEL=$ANDROID_SDK_VERSION -DANDROID_ABI=$ANDROID_ABI -DCMAKE_BUILD_TYPE=$BUILD_TYPE . @@ -189,7 +189,7 @@ matrix: - sudo git clone --depth=1 https://github.com/BeamMW/openssl-android.git /usr/local/Prebuilt-OpenSSL-Android - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android - - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android/Prebuilt + - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android - export PATH=$ANDROID_NDK_HOME:$PATH script: - cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake -DANDROID_NATIVE_API_LEVEL=$ANDROID_SDK_VERSION -DANDROID_ABI=$ANDROID_ABI -DCMAKE_BUILD_TYPE=$BUILD_TYPE . @@ -223,7 +223,7 @@ matrix: - sudo git clone --depth=1 https://github.com/BeamMW/openssl-android.git /usr/local/Prebuilt-OpenSSL-Android - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android - - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android/Prebuilt + - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android - export PATH=$ANDROID_NDK_HOME:$PATH script: - cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake -DANDROID_NATIVE_API_LEVEL=$ANDROID_SDK_VERSION -DANDROID_ABI=$ANDROID_ABI -DCMAKE_BUILD_TYPE=$BUILD_TYPE . @@ -260,7 +260,7 @@ matrix: - sudo git clone --depth=1 https://github.com/BeamMW/openssl-android.git /usr/local/Prebuilt-OpenSSL-Android - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle - export BOOST_ROOT_ANDROID=/usr/local/boost_1_68-android - - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android/Prebuilt + - export OPENSSL_ROOT_DIR_ANDROID=/usr/local/Prebuilt-OpenSSL-Android - export PATH=$ANDROID_NDK_HOME:$PATH script: - cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake -DANDROID_NATIVE_API_LEVEL=$ANDROID_SDK_VERSION -DANDROID_ABI=$ANDROID_ABI -DCMAKE_BUILD_TYPE=$BUILD_TYPE . From bbc933adb641c51726645151d5bcae75a55d5c91 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Tue, 12 Mar 2019 13:24:19 +0300 Subject: [PATCH 038/136] #90 gave list of default peers for android # Conflicts: # android/node_model.cpp # node/processor.h --- android/com/mw/beam/beamwallet/core/Api.java | 1 + android/jni.cpp | 18 +++++++++ android/node_model.cpp | 23 +---------- ui/viewmodel/start_view.cpp | 32 ++++----------- wallet/CMakeLists.txt | 1 + wallet/default_peers.cpp | 42 ++++++++++++++++++++ wallet/default_peers.h | 22 ++++++++++ 7 files changed, 94 insertions(+), 45 deletions(-) create mode 100644 wallet/default_peers.cpp create mode 100644 wallet/default_peers.h diff --git a/android/com/mw/beam/beamwallet/core/Api.java b/android/com/mw/beam/beamwallet/core/Api.java index 91944a8ec..19baaeafc 100644 --- a/android/com/mw/beam/beamwallet/core/Api.java +++ b/android/com/mw/beam/beamwallet/core/Api.java @@ -25,6 +25,7 @@ public class Api public native Wallet openWallet(String nodeAddr, String path, String pass); public native String[] createMnemonic(); public native boolean checkReceiverAddress(String address); + public native String[] getDefaultPeers(); static { diff --git a/android/jni.cpp b/android/jni.cpp index e2482755b..fa87820c6 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -16,6 +16,7 @@ #include "wallet/wallet_db.h" #include "wallet/wallet_network.h" #include "wallet/wallet_model_async.h" +#include "wallet/default_peers.h" #include "utility/bridge.h" #include "utility/string_helpers.h" @@ -212,6 +213,23 @@ JNIEXPORT jobject JNICALL BEAM_JAVA_API_INTERFACE(createMnemonic)(JNIEnv *env, j return phrasesArray; } +JNIEXPORT jobject JNICALL BEAM_JAVA_API_INTERFACE(getDefaultPeers)(JNIEnv *env, jobject thiz) +{ + auto peers = beam::getDefaultPeers(); + + jobjectArray peersArray = env->NewObjectArray(static_cast(peers.size()), env->FindClass("java/lang/String"), 0); + + int i = 0; + for (auto& peer : peers) + { + jstring str = env->NewStringUTF(peer.c_str()); + env->SetObjectArrayElement(peersArray, i++, str); + env->DeleteLocalRef(str); + } + + return peersArray; +} + JNIEXPORT jboolean JNICALL BEAM_JAVA_API_INTERFACE(checkReceiverAddress)(JNIEnv *env, jobject thiz, jstring address) { auto str = JString(env, address).value(); diff --git a/android/node_model.cpp b/android/node_model.cpp index 876f253f0..076a04f4d 100644 --- a/android/node_model.cpp +++ b/android/node_model.cpp @@ -20,6 +20,7 @@ #include #include "utility/logger.h" +#include "wallet/default_peers.h" using namespace beam; @@ -95,25 +96,5 @@ std::string NodeModel::getTempDir() std::vector NodeModel::getLocalNodePeers() { - std::vector result - { -#ifdef BEAM_TESTNET - "ap-node01.testnet.beam.mw:8100", - "ap-node02.testnet.beam.mw:8100", - "ap-node03.testnet.beam.mw:8100", - "eu-node01.testnet.beam.mw:8100", - "eu-node02.testnet.beam.mw:8100", - "eu-node03.testnet.beam.mw:8100", - "us-node01.testnet.beam.mw:8100", - "us-node02.testnet.beam.mw:8100", - "us-node03.testnet.beam.mw:8100" - #else - "eu-node01.masternet.beam.mw:8100", - "eu-node02.masternet.beam.mw:8100", - "eu-node03.masternet.beam.mw:8100", - "eu-node04.masternet.beam.mw:8100" -#endif - }; - - return result; + return getDefaultPeers(); } diff --git a/ui/viewmodel/start_view.cpp b/ui/viewmodel/start_view.cpp index ff54d88a1..401c3cd1f 100644 --- a/ui/viewmodel/start_view.cpp +++ b/ui/viewmodel/start_view.cpp @@ -33,6 +33,7 @@ #include "model/app_model.h" #include "version.h" #include "wallet/secstring.h" +#include "wallet/default_peers.h" #include #include @@ -44,26 +45,6 @@ using namespace std; namespace { - const char* Peers[] = - { -#ifdef BEAM_TESTNET - "ap-node01.testnet.beam.mw:8100", - "ap-node02.testnet.beam.mw:8100", - "ap-node03.testnet.beam.mw:8100", - "eu-node01.testnet.beam.mw:8100", - "eu-node02.testnet.beam.mw:8100", - "eu-node03.testnet.beam.mw:8100", - "us-node01.testnet.beam.mw:8100", - "us-node02.testnet.beam.mw:8100", - "us-node03.testnet.beam.mw:8100" - #else - "eu-node01.masternet.beam.mw:8100", - "eu-node02.masternet.beam.mw:8100", - "eu-node03.masternet.beam.mw:8100", - "eu-node04.masternet.beam.mw:8100" -#endif - }; - const QChar PHRASES_SEPARATOR = ';'; boost::filesystem::path pathFromStdString(const std::string& path) @@ -284,8 +265,9 @@ bool StartViewModel::getIsRunLocalNode() const QString StartViewModel::chooseRandomNode() const { + auto peers = getDefaultPeers(); srand(time(0)); - return QString(Peers[rand() % (sizeof(Peers) / sizeof(Peers[0]))]); + return QString(peers[rand() % peers.size()]); } QString StartViewModel::walletVersion() const @@ -322,13 +304,15 @@ void StartViewModel::setupLocalNode(int port, const QString& localNodePeer) settings.setLocalNodePort(port); settings.setRunLocalNode(true); QStringList peers; - for (size_t i = 0; i < _countof(Peers); ++i) + + for (const auto& peer : getDefaultPeers()) { - if (localNodePeer != Peers[i]) + if (localNodePeer != peer) { - peers.push_back(Peers[i]); + peers.push_back(peer); } } + peers.push_back(localNodePeer); settings.setLocalNodePeers(peers); } diff --git a/wallet/CMakeLists.txt b/wallet/CMakeLists.txt index 27c3d0869..1ceeb6bc5 100644 --- a/wallet/CMakeLists.txt +++ b/wallet/CMakeLists.txt @@ -8,6 +8,7 @@ add_definitions( -DSQLITE_HAS_CODEC ) set(WALLET_SRC common.cpp + default_peers.cpp wallet.h wallet.cpp wallet_transaction.cpp diff --git a/wallet/default_peers.cpp b/wallet/default_peers.cpp new file mode 100644 index 000000000..5eba29e7b --- /dev/null +++ b/wallet/default_peers.cpp @@ -0,0 +1,42 @@ +// Copyright 2019 The Beam Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and + +#include "default_peers.h" + +namespace beam +{ + std::vector getDefaultPeers() + { + std::vector result + { +#ifdef BEAM_TESTNET + "ap-node01.testnet.beam.mw:8100", + "ap-node02.testnet.beam.mw:8100", + "ap-node03.testnet.beam.mw:8100", + "eu-node01.testnet.beam.mw:8100", + "eu-node02.testnet.beam.mw:8100", + "eu-node03.testnet.beam.mw:8100", + "us-node01.testnet.beam.mw:8100", + "us-node02.testnet.beam.mw:8100", + "us-node03.testnet.beam.mw:8100" +#else + "eu-node01.masternet.beam.mw:8100", + "eu-node02.masternet.beam.mw:8100", + "eu-node03.masternet.beam.mw:8100", + "eu-node04.masternet.beam.mw:8100" +#endif + }; + + return result; + } +} \ No newline at end of file diff --git a/wallet/default_peers.h b/wallet/default_peers.h new file mode 100644 index 000000000..41a711ab3 --- /dev/null +++ b/wallet/default_peers.h @@ -0,0 +1,22 @@ +// Copyright 2019 The Beam Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and + +#pragma once + +#include +#include + +namespace beam +{ + std::vector getDefaultPeers(); +} \ No newline at end of file From 4225eef3cc0976511fe2040fdefcea37cc903823 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Tue, 12 Mar 2019 15:48:15 +0300 Subject: [PATCH 039/136] fixed build problem --- ui/viewmodel/start_view.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/viewmodel/start_view.cpp b/ui/viewmodel/start_view.cpp index 401c3cd1f..2e4c3fd04 100644 --- a/ui/viewmodel/start_view.cpp +++ b/ui/viewmodel/start_view.cpp @@ -267,7 +267,7 @@ QString StartViewModel::chooseRandomNode() const { auto peers = getDefaultPeers(); srand(time(0)); - return QString(peers[rand() % peers.size()]); + return QString(peers[rand() % peers.size()].c_str()); } QString StartViewModel::walletVersion() const @@ -307,9 +307,9 @@ void StartViewModel::setupLocalNode(int port, const QString& localNodePeer) for (const auto& peer : getDefaultPeers()) { - if (localNodePeer != peer) + if (localNodePeer != peer.c_str()) { - peers.push_back(peer); + peers.push_back(peer.c_str()); } } From 8b43a40e5a4c473386dc44205a3f5d3819b10b00 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Tue, 12 Mar 2019 16:33:56 +0300 Subject: [PATCH 040/136] #136 android wrapper for changeWalletPassword --- android/com/mw/beam/beamwallet/core/entities/Wallet.java | 2 +- android/jni.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/android/com/mw/beam/beamwallet/core/entities/Wallet.java b/android/com/mw/beam/beamwallet/core/entities/Wallet.java index 8406fb5ef..a051a3327 100644 --- a/android/com/mw/beam/beamwallet/core/entities/Wallet.java +++ b/android/com/mw/beam/beamwallet/core/entities/Wallet.java @@ -34,11 +34,11 @@ public class Wallet public native void cancelTx(String id); public native void deleteTx(String id); public native void deleteAddress(String walletID); + public native void changeWalletPassword(String password); // not implemented public native void changeCurrentWalletIDs(); //const beam::WalletID& senderID, const beam::WalletID& receiverID); public native void setNodeAddress(); //const std::string& addr); - public native void changeWalletPassword();//const beam::SecString& password); } diff --git a/android/jni.cpp b/android/jni.cpp index fa87820c6..8b188af6f 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -366,6 +366,12 @@ JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(deleteAddress)(JNIEnv *env, jo walletModel->getAsync()->deleteAddress(id); } +JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(changeWalletPassword)(JNIEnv *env, jobject thiz, + jstring password) +{ + walletModel->getAsync()->changeWalletPassword(JString(env, password).value()); +} + JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv *env; From 2f082fb9c4a5c34637cdef091e63009585c78638 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Tue, 12 Mar 2019 17:47:38 +0300 Subject: [PATCH 041/136] #129 fixed crash on android with expired address # Conflicts: # android/wallet_model.cpp --- .../mw/beam/beamwallet/core/listeners/WalletListener.java | 5 +++++ android/wallet_model.cpp | 6 +++++- wallet/wallet.h | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/android/com/mw/beam/beamwallet/core/listeners/WalletListener.java b/android/com/mw/beam/beamwallet/core/listeners/WalletListener.java index 67e6ee395..ccd7cbf0c 100644 --- a/android/com/mw/beam/beamwallet/core/listeners/WalletListener.java +++ b/android/com/mw/beam/beamwallet/core/listeners/WalletListener.java @@ -138,4 +138,9 @@ static void onNodeConnectionFailed() { System.out.println(">>>>>>>>>>>>>> async onNodeConnectionFailed() in Java"); } + + static void onCantSendToExpired() + { + System.out.println(">>>>>>>>>>>>>> async onCantSendToExpired() in Java"); + } } diff --git a/android/wallet_model.cpp b/android/wallet_model.cpp index f4a24d6cd..4c9af7a2d 100644 --- a/android/wallet_model.cpp +++ b/android/wallet_model.cpp @@ -279,5 +279,9 @@ void WalletModel::onSendMoneyVerified() void WalletModel::onCantSendToExpired() { - + JNIEnv* env = Android_JNI_getEnv(); + + jmethodID callback = env->GetStaticMethodID(WalletListenerClass, "onCantSendToExpired", "()V"); + + env->CallStaticVoidMethod(WalletListenerClass, callback); } \ No newline at end of file diff --git a/wallet/wallet.h b/wallet/wallet.h index ea80d3f60..e305ac841 100644 --- a/wallet/wallet.h +++ b/wallet/wallet.h @@ -25,7 +25,7 @@ namespace beam { public: explicit AddressExpiredException() - : std::runtime_error(nullptr) + : std::runtime_error("") { } From 5141757647f524af7ac13e478117365b238c2d1e Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Thu, 14 Mar 2019 13:26:36 +0300 Subject: [PATCH 042/136] added checkWalletPassword for android --- .../beam/beamwallet/core/entities/Wallet.java | 1 + android/jni.cpp | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/android/com/mw/beam/beamwallet/core/entities/Wallet.java b/android/com/mw/beam/beamwallet/core/entities/Wallet.java index a051a3327..c9e87dbcb 100644 --- a/android/com/mw/beam/beamwallet/core/entities/Wallet.java +++ b/android/com/mw/beam/beamwallet/core/entities/Wallet.java @@ -35,6 +35,7 @@ public class Wallet public native void deleteTx(String id); public native void deleteAddress(String walletID); public native void changeWalletPassword(String password); + public native boolean checkWalletPassword(String password); // not implemented public native void changeCurrentWalletIDs(); //const beam::WalletID& senderID, const beam::WalletID& receiverID); diff --git a/android/jni.cpp b/android/jni.cpp index 8b188af6f..5ec0ba45f 100644 --- a/android/jni.cpp +++ b/android/jni.cpp @@ -71,6 +71,7 @@ namespace using WalletSubscriber = ScopedSubscriber; static unique_ptr walletModel; + static ECC::NoLeak passwordHash; void initLogger(const string& appData) { @@ -123,6 +124,8 @@ JNIEXPORT jobject JNICALL BEAM_JAVA_API_INTERFACE(createWallet)(JNIEnv *env, job { LOG_DEBUG() << "wallet successfully created."; + passwordHash.V = beam::SecString(pass).hash().V; + // generate default address WalletAddress address = wallet::createAddress(*walletDB); @@ -182,6 +185,8 @@ JNIEXPORT jobject JNICALL BEAM_JAVA_API_INTERFACE(openWallet)(JNIEnv *env, jobje { LOG_DEBUG() << "wallet successfully opened."; + passwordHash.V = beam::SecString(pass).hash().V; + walletModel = make_unique(walletDB, JString(env, nodeAddrStr).value()); jobject walletObj = env->AllocObject(WalletClass); @@ -366,10 +371,22 @@ JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(deleteAddress)(JNIEnv *env, jo walletModel->getAsync()->deleteAddress(id); } +JNIEXPORT jboolean JNICALL BEAM_JAVA_WALLET_INTERFACE(checkWalletPassword)(JNIEnv *env, jobject thiz, + jstring password) +{ + auto pass = JString(env, password).value(); + auto hash = beam::SecString(pass).hash(); + + return passwordHash.V == hash.V; +} + JNIEXPORT void JNICALL BEAM_JAVA_WALLET_INTERFACE(changeWalletPassword)(JNIEnv *env, jobject thiz, jstring password) { - walletModel->getAsync()->changeWalletPassword(JString(env, password).value()); + auto pass = JString(env, password).value(); + + passwordHash.V = beam::SecString(pass).hash().V; + walletModel->getAsync()->changeWalletPassword(pass); } JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) From b09e89d41e9821448bac66bf55fed27de3b42512 Mon Sep 17 00:00:00 2001 From: "roman.strilets" Date: Thu, 21 Mar 2019 11:59:18 +0300 Subject: [PATCH 043/136] replaced testnet peers --- wallet/default_peers.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/wallet/default_peers.cpp b/wallet/default_peers.cpp index 5eba29e7b..46c96809f 100644 --- a/wallet/default_peers.cpp +++ b/wallet/default_peers.cpp @@ -20,15 +20,9 @@ namespace beam std::vector result { #ifdef BEAM_TESTNET - "ap-node01.testnet.beam.mw:8100", - "ap-node02.testnet.beam.mw:8100", - "ap-node03.testnet.beam.mw:8100", - "eu-node01.testnet.beam.mw:8100", - "eu-node02.testnet.beam.mw:8100", - "eu-node03.testnet.beam.mw:8100", - "us-node01.testnet.beam.mw:8100", - "us-node02.testnet.beam.mw:8100", - "us-node03.testnet.beam.mw:8100" + "us-nodes.testnet.beam.mw:8100", + "eu-nodes.testnet.beam.mw:8100", + "ap-nodes.testnet.beam.mw:8100" #else "eu-node01.masternet.beam.mw:8100", "eu-node02.masternet.beam.mw:8100", From 92b00f9a90efc3842b78983f77436c31e1d8de18 Mon Sep 17 00:00:00 2001 From: Anatol Date: Thu, 21 Mar 2019 23:54:48 +0300 Subject: [PATCH 044/136] macos signing --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0c39a7f60..05c8798ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -71,10 +71,10 @@ matrix: - export BEAM_WALLET_UI_IN="BeamWalletTestnet-$BEAM_VERSION-Darwin.dmg" - export BEAM_WALLET_UI_OUT="Beam-Wallet-Testnet-$BEAM_VERSION.dmg" # sign our builds - - codesign --force --deep --sign "$MACOS_SIGN_IDENTITY" beam/beam-node - - codesign --force --deep --sign "$MACOS_SIGN_IDENTITY" wallet/beam-wallet - - codesign --force --deep --sign "$MACOS_SIGN_IDENTITY" wallet/wallet-api - - codesign --force --deep --sign "$MACOS_SIGN_IDENTITY" explorer/explorer-node + - codesign --force --deep --sign "$MACOS_SIGN_IDENTITY" beam/beam-node-testnet + - codesign --force --deep --sign "$MACOS_SIGN_IDENTITY" wallet/beam-wallet-testnet + - codesign --force --deep --sign "$MACOS_SIGN_IDENTITY" wallet/wallet-api-testnet + - codesign --force --deep --sign "$MACOS_SIGN_IDENTITY" explorer/explorer-node-testnet - codesign --force --deep --sign "$MACOS_SIGN_IDENTITY" $BEAM_WALLET_UI_IN ############################################################################### From 1a143ddca4fab4af10e3d172a872c7036522736e Mon Sep 17 00:00:00 2001 From: Anatol Date: Fri, 22 Mar 2019 00:26:38 +0300 Subject: [PATCH 045/136] explorer-node fix --- explorer/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer/CMakeLists.txt b/explorer/CMakeLists.txt index a44c0fd81..725d5ba00 100644 --- a/explorer/CMakeLists.txt +++ b/explorer/CMakeLists.txt @@ -1,4 +1,4 @@ -set(TARGET_NAME explorer-node) +set(TARGET_NAME explorer-node-testnet) set(EXPLORER_SRC server.cpp From 6a9b8ddc210c29c75981cc79fabd819780396b5a Mon Sep 17 00:00:00 2001 From: Anatol Date: Fri, 22 Mar 2019 01:00:57 +0300 Subject: [PATCH 046/136] linux --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 05c8798ec..f1bd03bda 100644 --- a/.travis.yml +++ b/.travis.yml @@ -144,8 +144,8 @@ matrix: # extract build version - BEAM_VERSION="$(cat beam_version.gen)" && rm beam_version.gen - echo BEAM_VERSION = $BEAM_VERSION - - export BEAM_WALLET_UI_IN="BeamWallet-$BEAM_VERSION-Linux.deb" - - export BEAM_WALLET_UI_OUT="Beam-Wallet-$BEAM_VERSION.deb" + - export BEAM_WALLET_UI_IN="BeamWalletTestnet-$BEAM_VERSION-Linux.deb" + - export BEAM_WALLET_UI_OUT="Beam-Wallet-Testnet-$BEAM_VERSION.deb" ############################################################################### # Android x86 Release From 04cb7ee83c2227b638f9d2d853b198fe82c8320d Mon Sep 17 00:00:00 2001 From: Anatol Date: Fri, 22 Mar 2019 01:21:03 +0300 Subject: [PATCH 047/136] package name fixed --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 36f7b4356..8a268250b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -352,7 +352,7 @@ elseif (LINUX) endif () -set(CPACK_PACKAGE_NAME "BeamWallet") +set(CPACK_PACKAGE_NAME "BeamWalletTestnet") set(CPACK_PACKAGE_VENDOR "Beam Development Limited") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Scalable confidential cryptocurrency") set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}") From cff056efae022d464df62821a3aff6b04453d008 Mon Sep 17 00:00:00 2001 From: Anatol Date: Fri, 22 Mar 2019 14:29:49 +0300 Subject: [PATCH 048/136] testnet prefixes for appveyour --- appveyor.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index d48d01b55..2e625c6f0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,10 +6,10 @@ environment: OPENSSL_ROOT_DIR: c:\beam-libs\openssl QT5_ROOT_DIR: c:\beam-libs\qt5-static-win QML_IMPORT_PATH: c:\beam-libs\qt5-static-win\qml - BEAM_TARGET_SUFFIX: "" - BEAM_DISPLAY_SUFFIX: "" - BEAM_DISPLAY_SUFFIX2: "" - BEAM_DISPLAY_SUFFIX3: "" + BEAM_TARGET_SUFFIX: "-testnet" + BEAM_DISPLAY_SUFFIX: "Testnet" + BEAM_DISPLAY_SUFFIX2: "-Testnet" + BEAM_DISPLAY_SUFFIX3: " Testnet" BUILD_SERVER: secure: l9RqB2YbSnNIKZqTwnd67BHAXvbjmpj9zcf+YQPi9zfzsVeSysaoLD7gy4gSMjWurk2JVHjRpviw4bBxUbu2sA== BUILD_CONFIG: RelWithDebInfo From 5fef249c74414684a9088e041e5c694d65a649b0 Mon Sep 17 00:00:00 2001 From: valdok Date: Sun, 31 Mar 2019 16:24:44 +0300 Subject: [PATCH 049/136] Node: improved hdr/block request logic. More accurate accounting for num of hdrs/blocks, correct prioritizing. --- node/node.cpp | 77 ++++++++++++++++++++++++--------------------------- node/node.h | 2 +- 2 files changed, 37 insertions(+), 42 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index ccddbb205..6f62bd56f 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -135,7 +135,7 @@ void Node::UpdateSyncStatusRaw() void Node::DeleteUnassignedTask(Task& t) { - assert(!t.m_pOwner && !t.m_bPack); + assert(!t.m_pOwner && !t.m_nCount); m_lstTasksUnassigned.erase(TaskList::s_iterator_to(t)); m_setTasks.erase(TaskSet::s_iterator_to(t)); delete &t; @@ -313,10 +313,6 @@ bool Node::TryAssignTask(Task& t, Peer& p, bool bMustSupportLatestProto) bool Node::TryAssignTask(Task& t, Peer& p) { - uint32_t nPacks = t.m_Key.second ? m_nTasksPackBody : m_nTasksPackHdr; - if (nPacks) - return false; - if (!p.ShouldAssignTasks()) return false; @@ -353,7 +349,8 @@ bool Node::TryAssignTask(Task& t, Peer& p) // assign if (t.m_Key.second) { - assert(!m_nTasksPackBody); + if (m_nTasksPackBody >= m_Cfg.m_MaxConcurrentBlocksRequest) + return false; // too many blocks requested Height hCountExtra = t.m_sidTrg.m_Height - t.m_Key.first.m_Height; @@ -385,8 +382,8 @@ bool Node::TryAssignTask(Task& t, Peer& p) p.Send(msg); - t.m_bPack = true; - m_nTasksPackBody++; + t.m_nCount = std::min(static_cast(msg.m_CountExtra), m_Cfg.m_BandwidthCtl.m_MaxBodyPackCount) + 1; // just an estimate, the actual num of blocks can be smaller + m_nTasksPackBody += t.m_nCount; } else { @@ -423,7 +420,8 @@ bool Node::TryAssignTask(Task& t, Peer& p) pTask->m_sidTrg = t.m_sidTrg; pTask->m_bNeeded = false; - pTask->m_bPack = false; + pTask->m_nCount = 1; + m_nTasksPackBody++; t.m_Key.first.m_Height++; uint64_t rowid = pPtr[t.m_sidTrg.m_Height - t.m_Key.first.m_Height]; @@ -437,7 +435,8 @@ bool Node::TryAssignTask(Task& t, Peer& p) } else { - assert(!m_nTasksPackHdr); + if (m_nTasksPackHdr >= proto::g_HdrPackMaxSize) + return false; // too many hdrs requested if (nBlocks) return false; // don't requests headers from the peer that transfers a block @@ -454,22 +453,15 @@ bool Node::TryAssignTask(Task& t, Peer& p) if (nPackSize > dh) nPackSize = (uint32_t) dh; - if (nPackSize) - { - proto::GetHdrPack msg; - msg.m_Top = t.m_Key.first; - msg.m_Count = nPackSize; - p.Send(msg); + nPackSize = std::min(nPackSize, proto::g_HdrPackMaxSize - m_nTasksPackHdr); - t.m_bPack = true; - m_nTasksPackHdr++; - } - else - { - proto::GetHdr msg; - msg.m_ID = t.m_Key.first; - p.Send(msg); - } + proto::GetHdrPack msg; + msg.m_Top = t.m_Key.first; + msg.m_Count = nPackSize; + p.Send(msg); + + t.m_nCount = nPackSize; + m_nTasksPackHdr += nPackSize; } bool bEmpty = p.m_lstTasks.empty(); @@ -509,7 +501,7 @@ void Node::Processor::RequestData(const Block::SystemState::ID& id, bool bBlock, pTask->m_Key = tKey.m_Key; pTask->m_sidTrg = sidTrg; pTask->m_bNeeded = true; - pTask->m_bPack = false; + pTask->m_nCount = 0; pTask->m_pOwner = NULL; get_ParentObj().m_setTasks.insert(*pTask); @@ -522,8 +514,14 @@ void Node::Processor::RequestData(const Block::SystemState::ID& id, bool bBlock, { Node::Task& t = *it; t.m_bNeeded = true; - if (!t.m_pOwner && (t.m_sidTrg.m_Height < sidTrg.m_Height)) - t.m_sidTrg = sidTrg; + + if (!t.m_pOwner) + { + if (t.m_sidTrg.m_Height < sidTrg.m_Height) + t.m_sidTrg = sidTrg; + + get_ParentObj().TryAssignTask(t, pPreferredPeer); + } } } @@ -1384,13 +1382,13 @@ void Node::Peer::ReleaseTask(Task& t) assert(this == t.m_pOwner); t.m_pOwner = NULL; - if (t.m_bPack) + if (t.m_nCount) { uint32_t& nCounter = t.m_Key.second ? m_This.m_nTasksPackBody : m_This.m_nTasksPackHdr; - assert(nCounter); + assert(nCounter >= t.m_nCount); - nCounter--; - t.m_bPack = false; + nCounter -= t.m_nCount; + t.m_nCount = 0; } m_lstTasks.erase(TaskList::s_iterator_to(t)); @@ -1561,7 +1559,9 @@ void Node::Peer::OnFirstTaskDone() ReleaseTask(get_FirstTask()); SetTimerWrtFirstTask(); - TakeTasks(); // maybe can take more + // Refrain from using TakeTasks(), it will only try to assign tasks to this peer + m_This.RefreshCongestions(); + m_This.m_Processor.TryGoUpAsync(); } void Node::Peer::OnMsg(proto::DataMissing&&) @@ -1591,7 +1591,7 @@ void Node::Peer::OnMsg(proto::Hdr&& msg) { Task& t = get_FirstTask(); - if (t.m_Key.second || t.m_bPack) + if (t.m_Key.second || (t.m_nCount != 1)) ThrowUnexpected(); Block::SystemState::ID id; @@ -1648,7 +1648,7 @@ void Node::Peer::OnMsg(proto::HdrPack&& msg) { Task& t = get_FirstTask(); - if (t.m_Key.second || !t.m_bPack) + if (t.m_Key.second || !t.m_nCount) ThrowUnexpected(); if (msg.m_vElements.empty() || (msg.m_vElements.size() > proto::g_HdrPackMaxSize)) @@ -1699,8 +1699,6 @@ void Node::Peer::OnMsg(proto::HdrPack&& msg) { assert((Flags::PiRcvd & m_Flags) && m_pInfo); m_This.m_PeerMan.ModifyRating(*m_pInfo, PeerMan::Rating::RewardHeader * nAccepted, true); - - m_This.RefreshCongestions(); // may delete us } else { @@ -1827,7 +1825,7 @@ void Node::Peer::OnMsg(proto::BodyPack&& msg) { Task& t = get_FirstTask(); - if (!t.m_Key.second || !t.m_bPack) + if (!t.m_Key.second || !t.m_nCount) ThrowUnexpected(); const Block::SystemState::ID& id = t.m_Key.first; @@ -1881,9 +1879,6 @@ void Node::Peer::OnFirstTaskDone(NodeProcessor::DataStatus::Enum eStatus) get_FirstTask().m_bNeeded = false; OnFirstTaskDone(); - - if (NodeProcessor::DataStatus::Accepted == eStatus) - m_This.RefreshCongestions(); } void Node::Peer::OnMsg(proto::NewTransaction&& msg) diff --git a/node/node.h b/node/node.h index ab60f570e..4fa2f9a07 100644 --- a/node/node.h +++ b/node/node.h @@ -240,7 +240,7 @@ struct Node Key m_Key; bool m_bNeeded; - bool m_bPack; + uint32_t m_nCount; NodeDB::StateID m_sidTrg; Peer* m_pOwner; From 029012f6e623f448118678ab1ef2c11226631246 Mon Sep 17 00:00:00 2001 From: valdok Date: Sun, 31 Mar 2019 22:30:14 +0300 Subject: [PATCH 050/136] Node: adjusted sync status estimation --- node/node.cpp | 67 ++++++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index 6f62bd56f..74a45cb6d 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -79,25 +79,12 @@ void Node::UpdateSyncStatus() void Node::UpdateSyncStatusRaw() { - Height hToCursor = m_Processor.m_Cursor.m_ID.m_Height * (SyncStatus::s_WeightHdr + SyncStatus::s_WeightBlock); - m_SyncStatus.m_Total = hToCursor; - m_SyncStatus.m_Done = hToCursor; + Height hTotal = m_Processor.m_Cursor.m_ID.m_Height; + Height hDoneBlocks = hTotal; + Height hDoneHdrs = hTotal; if (m_Processor.IsFastSync()) - { - m_SyncStatus.m_Total += (m_Processor.m_SyncData.m_Target.m_Height - m_Processor.m_Cursor.m_ID.m_Height) * (SyncStatus::s_WeightHdr + SyncStatus::s_WeightBlock); - m_SyncStatus.m_Done += (m_Processor.m_SyncData.m_Target.m_Height - m_Processor.m_Cursor.m_ID.m_Height) * SyncStatus::s_WeightHdr; - - TaskSet::iterator it = m_setTasks.begin(); - if (m_setTasks.end() != it) - { - const Block::SystemState::ID& id = it->m_Key.first; - if (id.m_Height > m_Processor.m_Cursor.m_ID.m_Height) - m_SyncStatus.m_Done += (id.m_Height - m_Processor.m_Cursor.m_ID.m_Height) * SyncStatus::s_WeightBlock; - } - } - - bool bOnlyAssigned = (m_Processor.m_Cursor.m_ID.m_Height > 0); + hTotal = m_Processor.m_SyncData.m_Target.m_Height; for (TaskSet::iterator it = m_setTasks.begin(); m_setTasks.end() != it; it++) { @@ -107,30 +94,40 @@ void Node::UpdateSyncStatusRaw() if (m_Processor.m_Cursor.m_ID.m_Height >= t.m_sidTrg.m_Height) continue; - if (bOnlyAssigned && !t.m_pOwner) - continue; - - Height hVal = t.m_sidTrg.m_Height * (SyncStatus::s_WeightHdr + SyncStatus::s_WeightBlock); - m_SyncStatus.m_Total = std::max(m_SyncStatus.m_Total, hVal); - - Height h = t.m_Key.first.m_Height; - if (h > t.m_sidTrg.m_Height) - continue; // ?! - bool bBlock = t.m_Key.second; - // If the request is the block - assume all the headers are received, as well as all the blocks up to cursor - // If the request is the header - assume headers are requested in reverse order, up to current cursor (which isn't true in case of fork, but it's a coarse estimate) if (bBlock) - h = m_Processor.m_Cursor.m_ID.m_Height; // the height down to which all the headers are already downloaded + { + assert(t.m_Key.first.m_Height); + // all the blocks up to this had been dloaded + hTotal = std::max(hTotal, t.m_sidTrg.m_Height); + hDoneHdrs = std::max(hDoneHdrs, t.m_sidTrg.m_Height); + hDoneBlocks = std::max(hDoneBlocks, t.m_Key.first.m_Height - 1); + } else - if (h) - h--; + { + if (!t.m_pOwner) + continue; // don't account for unowned - hVal = hToCursor + (t.m_sidTrg.m_Height - h) * SyncStatus::s_WeightHdr; - m_SyncStatus.m_Done = std::max(m_SyncStatus.m_Done, hVal); + hTotal = std::max(hTotal, t.m_sidTrg.m_Height); + hDoneHdrs = std::max(hDoneHdrs, m_Processor.m_Cursor.m_ID.m_Height + t.m_sidTrg.m_Height - t.m_Key.first.m_Height); + } } - m_SyncStatus.m_Total = std::max(m_SyncStatus.m_Total, m_SyncStatus.m_Done); + // account for treasury + hTotal++; + + if (m_Processor.IsTreasuryHandled()) + { + hDoneBlocks++; + hDoneHdrs++; + } + + // corrections + hDoneHdrs = std::max(hDoneHdrs, hDoneBlocks); + hTotal = std::max(hTotal, hDoneHdrs); + + m_SyncStatus.m_Total = hTotal * (SyncStatus::s_WeightHdr + SyncStatus::s_WeightBlock); + m_SyncStatus.m_Done = hDoneHdrs * SyncStatus::s_WeightHdr + hDoneBlocks * SyncStatus::s_WeightBlock; } void Node::DeleteUnassignedTask(Task& t) From 5cb875ed6268dbdd0d028ae1b44cad23cc10806d Mon Sep 17 00:00:00 2001 From: valdok Date: Sun, 31 Mar 2019 23:57:16 +0300 Subject: [PATCH 051/136] Node: adjusted sync status estimation (2) --- node/node.cpp | 3 ++- node/processor.cpp | 9 ++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index 74a45cb6d..6f0993417 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -109,7 +109,8 @@ void Node::UpdateSyncStatusRaw() continue; // don't account for unowned hTotal = std::max(hTotal, t.m_sidTrg.m_Height); - hDoneHdrs = std::max(hDoneHdrs, m_Processor.m_Cursor.m_ID.m_Height + t.m_sidTrg.m_Height - t.m_Key.first.m_Height); + if (t.m_sidTrg.m_Height > t.m_Key.first.m_Height) + hDoneHdrs = std::max(hDoneHdrs, m_Processor.m_Cursor.m_ID.m_Height + t.m_sidTrg.m_Height - t.m_Key.first.m_Height); } } diff --git a/node/processor.cpp b/node/processor.cpp index 1f9ac8b68..96943a578 100644 --- a/node/processor.cpp +++ b/node/processor.cpp @@ -433,13 +433,8 @@ void NodeProcessor::EnumCongestions() Block::SystemState::ID id; NodeDB::StateID sidTrg; - if (IsFastSync()) - sidTrg = m_SyncData.m_Target; - else - { - sidTrg.m_Height = x.m_Height; - sidTrg.m_Row = x.m_Rows.at(0); - } + sidTrg.m_Height = x.m_Height; + sidTrg.m_Row = x.m_Rows.at(0); if (!x.m_bNeedHdrs) { From aaf9097479b36852bd8a0491bdf2b419020f5c57 Mon Sep 17 00:00:00 2001 From: valdok Date: Mon, 1 Apr 2019 09:20:12 +0300 Subject: [PATCH 052/136] Node: creating decoys only if the owner key is specified (i.e. they should be found later). --- node/node.cpp | 39 +++++++-------------------------------- node/node.h | 4 +--- 2 files changed, 8 insertions(+), 35 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index 6f0993417..45db9a069 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -824,11 +824,6 @@ bool Node::Processor::EnumViewerKeys(IKeyWalker& w) return false; } - if (keys.m_bRecoverViaDummyKey && !w.OnKey(*keys.m_pOwner, 1)) { - // stupid compiler insists on parentheses here! - return false; - } - return true; } @@ -908,7 +903,6 @@ void Node::Keys::SetSingleKey(const Key::IKdf::Ptr& pKdf) m_nMinerSubIndex = 0; m_pMiner = pKdf; m_pGeneric = pKdf; - m_pDummy = pKdf; m_pOwner = pKdf; } @@ -986,29 +980,11 @@ void Node::InitIDs() m_MyPrivateID = s.V; proto::Sk2Pk(m_MyPublicID, m_MyPrivateID); - - if (!m_Keys.m_pDummy) - { - // create it using Node-ID - ECC::NoLeak hv; - ECC::Hash::Processor() << m_MyPrivateID >> hv.V; - - std::shared_ptr pKdf = std::make_shared(); - pKdf->Generate(hv.V); - m_Keys.m_pDummy = std::move(pKdf); - } - } void Node::RefreshOwnedUtxos() { ECC::Hash::Processor hp; - if (m_Keys.m_pDummy) - { - ECC::Scalar::Native sk; - m_Keys.m_pDummy->DeriveKey(sk, Key::ID(0, Key::Type::Decoy)); - hp << sk; - } if (m_Keys.m_pOwner) { @@ -1027,11 +1003,7 @@ void Node::RefreshOwnedUtxos() if (hv0 == hv1) return; // unchaged - if (m_Keys.m_pDummy && !(m_Keys.m_pOwner && m_Keys.m_pOwner->IsSame(*m_Keys.m_pDummy))) - m_Keys.m_bRecoverViaDummyKey = true; - m_Processor.RescanOwnedTxos(); - m_Keys.m_bRecoverViaDummyKey = false; blob = Blob(hv0); m_Processor.get_DB().ParamSet(NodeDB::ParamID::DummyID, NULL, &blob); @@ -2045,7 +2017,7 @@ bool Node::OnTransactionStem(Transaction::Ptr&& ptx, const Peer* pPeer) assert(!pDup->m_bAggregating); - if (pDup->m_pValue->m_vOutputs.size() > m_Cfg.m_Dandelion.m_OutputsMax) + if ((pDup->m_pValue->m_vOutputs.size() >= m_Cfg.m_Dandelion.m_OutputsMax) || !m_Keys.m_pMiner) OnTransactionAggregated(*pDup); else { @@ -2144,6 +2116,9 @@ void Node::PerformAggregation(TxPool::Stem::Element& x) void Node::AddDummyInputs(Transaction& tx) { + if (!m_Keys.m_pMiner) + return; + bool bModified = false; while (tx.m_vInputs.size() < m_Cfg.m_Dandelion.m_OutputsMax) @@ -2164,7 +2139,7 @@ void Node::AddDummyInputs(Transaction& tx) UtxoTree::Key kMin, kMax; UtxoTree::Key::Data d; - SwitchCommitment().Create(sk, d.m_Commitment, *m_Keys.m_pDummy, kidv); + SwitchCommitment().Create(sk, d.m_Commitment, *m_Keys.m_pMiner, kidv); d.m_Maturity = 0; kMin = d; @@ -2212,7 +2187,7 @@ void Node::AddDummyInputs(Transaction& tx) void Node::AddDummyOutputs(Transaction& tx) { - if (!m_Cfg.m_Dandelion.m_DummyLifetimeHi) + if (!m_Cfg.m_Dandelion.m_DummyLifetimeHi || !m_Keys.m_pMiner) return; // add dummy outputs @@ -2236,7 +2211,7 @@ void Node::AddDummyOutputs(Transaction& tx) Output::Ptr pOutput(new Output); ECC::Scalar::Native sk; - pOutput->Create(sk, *m_Keys.m_pDummy, kidv, *m_Keys.m_pDummy); + pOutput->Create(sk, *m_Keys.m_pMiner, kidv, *m_Keys.m_pOwner); Height h = SampleDummySpentHeight(); db.InsertDummy(h, kidv); diff --git a/node/node.h b/node/node.h index 4fa2f9a07..1fae0d3e5 100644 --- a/node/node.h +++ b/node/node.h @@ -122,11 +122,9 @@ struct Node Key::IKdf::Ptr m_pGeneric; // used for internal nonce generation. Auto-generated from system random if not specified Key::IPKdf::Ptr m_pOwner; // used for wallet authentication and UTXO tagging (this is the master view key) - Key::IKdf::Ptr m_pMiner; // if not set - offline mining would be impossible - Key::IKdf::Ptr m_pDummy; + Key::IKdf::Ptr m_pMiner; // if not set - offline mining and decoy creation would be impossible Key::Index m_nMinerSubIndex = 0; - bool m_bRecoverViaDummyKey = false; // normally only owner key is used in runtime. On startup dummy can be used too to rescan dummies void InitSingleKey(const ECC::uintBig& seed); void SetSingleKey(const Key::IKdf::Ptr&); From b413cd26821eebc7552b71ed80c44f345aecf6d4 Mon Sep 17 00:00:00 2001 From: valdok Date: Mon, 1 Apr 2019 20:53:39 +0300 Subject: [PATCH 053/136] m --- node/node.h | 1 - 1 file changed, 1 deletion(-) diff --git a/node/node.h b/node/node.h index 1fae0d3e5..0595952d8 100644 --- a/node/node.h +++ b/node/node.h @@ -62,7 +62,6 @@ struct Node } m_Timeout; uint32_t m_MaxConcurrentBlocksRequest = 18; - uint32_t m_BbsIdealChannelPopulation = 100; uint32_t m_MaxPoolTransactions = 100 * 1000; uint32_t m_MiningThreads = 0; // by default disabled From 66f4acdcdc35ad198ba043bb9752496acccb4560 Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 2 Apr 2019 10:59:53 +0300 Subject: [PATCH 054/136] Node: sync-finish criteria by tip comparing timestamp to current time --- node/node.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/node/node.cpp b/node/node.cpp index 45db9a069..7a3a6b866 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -127,6 +127,30 @@ void Node::UpdateSyncStatusRaw() hDoneHdrs = std::max(hDoneHdrs, hDoneBlocks); hTotal = std::max(hTotal, hDoneHdrs); + // consider the timestamp of the tip, upon successful sync it should not be too far in the past + if (m_Processor.m_Cursor.m_ID.m_Height < Rules::HeightGenesis) + hTotal++; + else + { + Timestamp ts0_s = m_Processor.m_Cursor.m_Full.m_TimeStamp; + Timestamp ts1_s = getTimestamp(); + + const Timestamp tolerance_s = 60 * 60 * 24 * 2; // 2 days tolerance. In case blocks not created for some reason (mining turned off on testnet or etc.) we still don't want to get stuck in sync mode + ts0_s += tolerance_s; + + if (ts1_s > ts0_s) + { + ts1_s -= ts0_s; + + hTotal++; + + const uint32_t& trg_s = Rules::get().DA.Target_s; + if (trg_s) + hTotal = std::max(hTotal, m_Processor.m_Cursor.m_ID.m_Height + ts1_s / trg_s); + } + + } + m_SyncStatus.m_Total = hTotal * (SyncStatus::s_WeightHdr + SyncStatus::s_WeightBlock); m_SyncStatus.m_Done = hDoneHdrs * SyncStatus::s_WeightHdr + hDoneBlocks * SyncStatus::s_WeightBlock; } From bb4e6e77d888e142140633d2ef0775bafcf10d94 Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 2 Apr 2019 17:15:24 +0300 Subject: [PATCH 055/136] Node/CLI: added --reset_id option to reset internal ID after cloning --- beam/cli.cpp | 3 +++ node/node.cpp | 4 +++- node/processor.h | 1 + utility/options.cpp | 2 ++ utility/options.h | 1 + 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/beam/cli.cpp b/beam/cli.cpp index 02647ef09..b643973af 100644 --- a/beam/cli.cpp +++ b/beam/cli.cpp @@ -312,6 +312,9 @@ int main_impl(int argc, char* argv[]) if (vm.count(cli::CHECKDB)) node.m_Cfg.m_ProcessorParams.m_CheckIntegrityAndVacuum = vm[cli::CHECKDB].as(); + if (vm.count(cli::RESET_ID)) + node.m_Cfg.m_ProcessorParams.m_ResetSelfID = vm[cli::RESET_ID].as(); + node.m_Cfg.m_Bbs = vm[cli::BBS_ENABLE].as(); node.m_Cfg.m_Horizon.m_Branching = Rules::get().Macroblock.MaxRollback / 4; // inferior branches would be pruned when height difference is this. diff --git a/node/node.cpp b/node/node.cpp index 7a3a6b866..a7e8781b0 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -992,7 +992,9 @@ void Node::InitIDs() ECC::NoLeak s; Blob blob(s.V.m_Value); - bool bNewID = !m_Processor.get_DB().ParamGet(NodeDB::ParamID::MyID, NULL, &blob); + bool bNewID = + m_Cfg.m_ProcessorParams.m_ResetSelfID || + !m_Processor.get_DB().ParamGet(NodeDB::ParamID::MyID, NULL, &blob); if (bNewID) { diff --git a/node/processor.h b/node/processor.h index da57178ea..1a4f87475 100644 --- a/node/processor.h +++ b/node/processor.h @@ -113,6 +113,7 @@ class NodeProcessor struct StartParams { bool m_ResetCursor = false; bool m_CheckIntegrityAndVacuum = false; + bool m_ResetSelfID = false; }; void Initialize(const char* szPath); diff --git a/utility/options.cpp b/utility/options.cpp index 8ffbde041..6d919adaa 100644 --- a/utility/options.cpp +++ b/utility/options.cpp @@ -51,6 +51,7 @@ namespace beam const char* TREASURY = "treasury"; const char* TREASURY_BLOCK = "treasury_path"; const char* RESYNC = "resync"; + const char* RESET_ID = "reset_id"; const char* CHECKDB = "check_db"; const char* CRASH = "crash"; const char* INIT = "init"; @@ -156,6 +157,7 @@ namespace beam (cli::STRATUM_SECRETS_PATH, po::value()->default_value("."), "path to stratum server api keys file, and tls certificate and private key") (cli::STRATUM_USE_TLS, po::value()->default_value(true), "enable TLS on startum server") (cli::RESYNC, po::value()->default_value(false), "Enforce re-synchronization (soft reset)") + (cli::RESET_ID, po::value()->default_value(false), "Reset self ID (used for network authentication). Must do if the node is cloned") (cli::CHECKDB, po::value()->default_value(false), "DB integrity check and compact (vacuum)") (cli::BBS_ENABLE, po::value()->default_value(true), "Enable SBBS messaging") (cli::CRASH, po::value()->default_value(0), "Induce crash (test proper handling)") diff --git a/utility/options.h b/utility/options.h index d5a8c7caf..ac6721eaf 100644 --- a/utility/options.h +++ b/utility/options.h @@ -50,6 +50,7 @@ namespace beam extern const char* TREASURY; extern const char* TREASURY_BLOCK; extern const char* RESYNC; + extern const char* RESET_ID; extern const char* CHECKDB; extern const char* CRASH; extern const char* INIT; From 2387f1da6b2be0cb24cf0474c9ffd1186cb2daaf Mon Sep 17 00:00:00 2001 From: valdok Date: Tue, 2 Apr 2019 17:31:21 +0300 Subject: [PATCH 056/136] Node/CLI: added --erase_id option to reset internal ID BEFORE cloning --- beam/cli.cpp | 3 +++ node/node.cpp | 9 +++++++++ node/processor.h | 1 + utility/options.cpp | 2 ++ utility/options.h | 1 + 5 files changed, 16 insertions(+) diff --git a/beam/cli.cpp b/beam/cli.cpp index b643973af..24ceff196 100644 --- a/beam/cli.cpp +++ b/beam/cli.cpp @@ -315,6 +315,9 @@ int main_impl(int argc, char* argv[]) if (vm.count(cli::RESET_ID)) node.m_Cfg.m_ProcessorParams.m_ResetSelfID = vm[cli::RESET_ID].as(); + if (vm.count(cli::ERASE_ID)) + node.m_Cfg.m_ProcessorParams.m_EraseSelfID = vm[cli::ERASE_ID].as(); + node.m_Cfg.m_Bbs = vm[cli::BBS_ENABLE].as(); node.m_Cfg.m_Horizon.m_Branching = Rules::get().Macroblock.MaxRollback / 4; // inferior branches would be pruned when height difference is this. diff --git a/node/node.cpp b/node/node.cpp index a7e8781b0..e9f82d38c 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -935,6 +935,15 @@ void Node::Initialize(IExternalPOW* externalPOW) m_Processor.m_Horizon = m_Cfg.m_Horizon; m_Processor.Initialize(m_Cfg.m_sPathLocal.c_str(), m_Cfg.m_ProcessorParams); + if (m_Cfg.m_ProcessorParams.m_EraseSelfID) + { + m_Processor.get_DB().ParamSet(NodeDB::ParamID::MyID, nullptr, nullptr); + LOG_INFO() << "Node ID erased"; + + io::Reactor::get_Current().stop(); + return; + } + InitKeys(); InitIDs(); diff --git a/node/processor.h b/node/processor.h index 1a4f87475..5cc3e95b9 100644 --- a/node/processor.h +++ b/node/processor.h @@ -114,6 +114,7 @@ class NodeProcessor bool m_ResetCursor = false; bool m_CheckIntegrityAndVacuum = false; bool m_ResetSelfID = false; + bool m_EraseSelfID = false; }; void Initialize(const char* szPath); diff --git a/utility/options.cpp b/utility/options.cpp index 6d919adaa..fc91ddf3c 100644 --- a/utility/options.cpp +++ b/utility/options.cpp @@ -52,6 +52,7 @@ namespace beam const char* TREASURY_BLOCK = "treasury_path"; const char* RESYNC = "resync"; const char* RESET_ID = "reset_id"; + const char* ERASE_ID = "erase_id"; const char* CHECKDB = "check_db"; const char* CRASH = "crash"; const char* INIT = "init"; @@ -158,6 +159,7 @@ namespace beam (cli::STRATUM_USE_TLS, po::value()->default_value(true), "enable TLS on startum server") (cli::RESYNC, po::value()->default_value(false), "Enforce re-synchronization (soft reset)") (cli::RESET_ID, po::value()->default_value(false), "Reset self ID (used for network authentication). Must do if the node is cloned") + (cli::ERASE_ID, po::value()->default_value(false), "Reset self ID (used for network authentication) and stop before re-creating the new one.") (cli::CHECKDB, po::value()->default_value(false), "DB integrity check and compact (vacuum)") (cli::BBS_ENABLE, po::value()->default_value(true), "Enable SBBS messaging") (cli::CRASH, po::value()->default_value(0), "Induce crash (test proper handling)") diff --git a/utility/options.h b/utility/options.h index ac6721eaf..d6fe028fe 100644 --- a/utility/options.h +++ b/utility/options.h @@ -51,6 +51,7 @@ namespace beam extern const char* TREASURY_BLOCK; extern const char* RESYNC; extern const char* RESET_ID; + extern const char* ERASE_ID; extern const char* CHECKDB; extern const char* CRASH; extern const char* INIT; From 5b29cc3b1ab6f284af451b1da487a9a7054d1511 Mon Sep 17 00:00:00 2001 From: valdok Date: Wed, 3 Apr 2019 01:25:12 +0300 Subject: [PATCH 057/136] Node: improved decoy handling. Setting SubIdx==MinerSubIndex on creation, accounting for it when spending. --- node/node.cpp | 92 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 37 deletions(-) diff --git a/node/node.cpp b/node/node.cpp index e9f82d38c..661b13f05 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -1023,7 +1023,8 @@ void Node::RefreshOwnedUtxos() if (m_Keys.m_pOwner) { - ECC::uintBig hv(Zero); + ECC::uintBig hv; + hv = m_Keys.m_nMinerSubIndex; // rescan also when miner subkey changes, to recover possible decoys that were rejected earlier ECC::Scalar::Native sk; m_Keys.m_pOwner->DerivePKey(sk, hv); hp << sk; @@ -2163,54 +2164,70 @@ void Node::AddDummyInputs(Transaction& tx) if (h > m_Processor.m_Cursor.m_ID.m_Height) break; + Key::IKdf::Ptr pChild; + Key::IKdf* pKdf = nullptr; + + if (kidv.m_SubIdx == m_Keys.m_nMinerSubIndex) + pKdf = m_Keys.m_pMiner.get(); + else + { + // was created by other miner. If we have the root key - we can recreate its key + if (!m_Keys.m_nMinerSubIndex) + { + ECC::HKdf::CreateChild(pChild, *m_Keys.m_pMiner, kidv.m_SubIdx); + pKdf = pChild.get(); + } + } + kidv.m_Value = 0; bModified = true; - // ECC::Mode::Scope scope(ECC::Mode::Fast); - - ECC::Scalar::Native sk; + bool bFound = false; + if (pKdf) + { + ECC::Scalar::Native sk; - // bounds - UtxoTree::Key kMin, kMax; + // bounds + UtxoTree::Key kMin, kMax; - UtxoTree::Key::Data d; - SwitchCommitment().Create(sk, d.m_Commitment, *m_Keys.m_pMiner, kidv); - d.m_Maturity = 0; - kMin = d; + UtxoTree::Key::Data d; + SwitchCommitment().Create(sk, d.m_Commitment, *pKdf, kidv); + d.m_Maturity = 0; + kMin = d; - d.m_Maturity = m_Processor.m_Cursor.m_ID.m_Height; - kMax = d; + d.m_Maturity = m_Processor.m_Cursor.m_ID.m_Height; + kMax = d; - // check if it's still unspent - struct Traveler :public UtxoTree::ITraveler { - virtual bool OnLeaf(const RadixTree::Leaf& x) override { - return false; - } - } t; + // check if it's still unspent + struct Traveler :public UtxoTree::ITraveler { + virtual bool OnLeaf(const RadixTree::Leaf& x) override { + return false; + } + } t; - UtxoTree::Cursor cu; - t.m_pCu = &cu; - t.m_pBound[0] = kMin.m_pArr; - t.m_pBound[1] = kMax.m_pArr; + UtxoTree::Cursor cu; + t.m_pCu = &cu; + t.m_pBound[0] = kMin.m_pArr; + t.m_pBound[1] = kMax.m_pArr; - if (m_Processor.get_Utxos().Traverse(t)) - { - // spent - m_Processor.get_DB().DeleteDummy(kidv); - } - else - { - // unspent - Input::Ptr pInp(new Input); - pInp->m_Commitment = d.m_Commitment; + bFound = !m_Processor.get_Utxos().Traverse(t); + if (bFound) + { + // unspent + Input::Ptr pInp(new Input); + pInp->m_Commitment = d.m_Commitment; - tx.m_vInputs.push_back(std::move(pInp)); - tx.m_Offset = ECC::Scalar::Native(tx.m_Offset) + ECC::Scalar::Native(sk); + tx.m_vInputs.push_back(std::move(pInp)); + tx.m_Offset = ECC::Scalar::Native(tx.m_Offset) + ECC::Scalar::Native(sk); - /// in the (unlikely) case the tx will be lost - we'll retry spending this UTXO after the following num of blocks - m_Processor.get_DB().SetDummyHeight(kidv, m_Processor.m_Cursor.m_ID.m_Height + m_Cfg.m_Dandelion.m_DummyLifetimeLo + 1); - } + /// in the (unlikely) case the tx will be lost - we'll retry spending this UTXO after the following num of blocks + m_Processor.get_DB().SetDummyHeight(kidv, m_Processor.m_Cursor.m_ID.m_Height + m_Cfg.m_Dandelion.m_DummyLifetimeLo + 1); + } + } + if (!bFound) + // spent + m_Processor.get_DB().DeleteDummy(kidv); } if (bModified) @@ -2234,6 +2251,7 @@ void Node::AddDummyOutputs(Transaction& tx) { Key::IDV kidv(Zero); kidv.m_Type = Key::Type::Decoy; + kidv.m_SubIdx = m_Keys.m_nMinerSubIndex; while (true) { From 66f823d77f20235ed9ab8e62e6473960939d4c67 Mon Sep 17 00:00:00 2001 From: szavarza Date: Wed, 27 Mar 2019 19:46:44 +0300 Subject: [PATCH 058/136] #522 Skins implementation # Conflicts: # CMakeLists.txt # ui/view/controls/Style.qml --- .gitignore | 3 + ui/CMakeLists.txt | 21 +- ui/{beam.icns => icons/beam_mainnet.icns} | Bin ui/{beam.png => icons/beam_mainnet.png} | Bin ui/icons/beam_masternet.icns | Bin 0 -> 32477 bytes ui/icons/beam_masternet.png | Bin 0 -> 37278 bytes ui/icons/beam_testnet.icns | Bin 0 -> 201030 bytes ui/icons/beam_testnet.png | Bin 0 -> 60631 bytes ui/{icon.ico => icons/icon_mainnet.ico} | Bin ui/icons/icon_masternet.ico | Bin 0 -> 67646 bytes ui/icons/icon_testnet.ico | Bin 0 -> 39299 bytes ui/ui.cpp | 10 +- ui/view/addresses.qml | 104 ++-- ui/view/assets/icon_masternet.png | Bin 0 -> 16922 bytes ui/view/assets/icon_testnet.png | Bin 0 -> 60631 bytes ui/view/color_themes/AbstractColors.qml | 23 + ui/view/color_themes/Mainnet.qml | 24 + ui/view/color_themes/Masternet.qml | 23 + ui/view/color_themes/Testnet.qml | 23 + ui/view/controls/AddressComboBox.qml | 12 +- ui/view/controls/AddressTable.qml | 70 +-- ui/view/controls/AvailablePanel.qml | 8 +- ui/view/controls/ChangePasswordDialog.qml | 18 +- ui/view/controls/ConfirmationDialog.qml | 24 +- ui/view/controls/ContextMenu.qml | 10 +- ui/view/controls/CustomButton.qml | 11 +- ui/view/controls/CustomCheckBox.qml | 8 +- ui/view/controls/CustomComboBox.qml | 12 +- ui/view/controls/CustomProgressBar.qml | 16 +- ui/view/controls/CustomRadioButton.qml | 6 +- ui/view/controls/CustomSwitch.qml | 8 +- ui/view/controls/CustomTableView.qml | 6 +- ui/view/controls/CustomToolButton.qml | 4 +- ui/view/controls/DefaultButton.qml | 6 +- ui/view/controls/EditAddress.qml | 20 +- ui/view/controls/FeeSlider.qml | 32 +- ui/view/controls/Led.qml | 6 +- ui/view/controls/LogoComponent.qml | 39 +- ui/view/controls/PaymentInfoDialog.qml | 32 +- ui/view/controls/PrimaryButton.qml | 6 +- ui/view/controls/SFTextInput.qml | 2 +- ui/view/controls/SecondaryPanel.qml | 16 +- ui/view/controls/SecurityNote.qml | 38 +- ui/view/controls/StatusBar.qml | 30 +- ui/view/controls/Style.qml | 49 +- ui/view/controls/TableItem.qml | 2 +- ui/view/controls/TransactionDetails.qml | 28 +- ui/view/controls/TxFilter.qml | 6 +- ui/view/dashboard.qml | 4 +- ui/view/info.qml | 4 +- ui/view/loading.qml | 192 +++---- ui/view/main.qml | 16 +- ui/view/notification.qml | 4 +- ui/view/qml.qrc | 6 + ui/view/root.qml | 4 +- ui/view/settings.qml | 76 +-- ui/view/start.qml | 626 +++++++++++----------- ui/view/utxo.qml | 36 +- ui/view/wallet.qml | 119 ++-- ui/viewmodel/theme.cpp | 40 ++ ui/viewmodel/theme.h | 23 + 61 files changed, 1063 insertions(+), 843 deletions(-) rename ui/{beam.icns => icons/beam_mainnet.icns} (100%) rename ui/{beam.png => icons/beam_mainnet.png} (100%) create mode 100644 ui/icons/beam_masternet.icns create mode 100644 ui/icons/beam_masternet.png create mode 100644 ui/icons/beam_testnet.icns create mode 100644 ui/icons/beam_testnet.png rename ui/{icon.ico => icons/icon_mainnet.ico} (100%) create mode 100644 ui/icons/icon_masternet.ico create mode 100644 ui/icons/icon_testnet.ico create mode 100644 ui/view/assets/icon_masternet.png create mode 100644 ui/view/assets/icon_testnet.png create mode 100644 ui/view/color_themes/AbstractColors.qml create mode 100644 ui/view/color_themes/Mainnet.qml create mode 100644 ui/view/color_themes/Masternet.qml create mode 100644 ui/view/color_themes/Testnet.qml create mode 100644 ui/viewmodel/theme.cpp create mode 100644 ui/viewmodel/theme.h diff --git a/.gitignore b/.gitignore index 8edcbcc70..f953decc2 100644 --- a/.gitignore +++ b/.gitignore @@ -99,4 +99,7 @@ CMakeSettings.json beam/wallet.dat 3rdparty/opencl-miner/equihash_150_5.dat ui/beam.rc +ui/beam.png +ui/beam.icns +ui/icon.ico beam_version.gen diff --git a/ui/CMakeLists.txt b/ui/CMakeLists.txt index b19c1a77e..eadd8ef86 100644 --- a/ui/CMakeLists.txt +++ b/ui/CMakeLists.txt @@ -65,7 +65,9 @@ set(UI_SRC viewmodel/messages_view.h viewmodel/messages_view.cpp viewmodel/statusbar_view.h - viewmodel/statusbar_view.cpp + viewmodel/statusbar_view.cpp + viewmodel/theme.h + viewmodel/theme.cpp model/wallet_model.h model/wallet_model.cpp @@ -88,6 +90,23 @@ endif() if(WIN32) add_definitions(-DWIN32_LEAN_AND_MEAN) endif() + +set(BEAM_ICON_SUFFIX "masternet") +if(BEAM_TESTNET) + set(BEAM_ICON_SUFFIX "testnet") +elseif(BEAM_MAINNET) + set(BEAM_ICON_SUFFIX "mainnet") +endif() + +file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/icons/icon_${BEAM_ICON_SUFFIX}.ico + ${CMAKE_CURRENT_SOURCE_DIR}/icons/beam_${BEAM_ICON_SUFFIX}.png + ${CMAKE_CURRENT_SOURCE_DIR}/icons/beam_${BEAM_ICON_SUFFIX}.icns + DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}) + +file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/icon_${BEAM_ICON_SUFFIX}.ico ${CMAKE_CURRENT_SOURCE_DIR}/icon.ico) +file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/beam_${BEAM_ICON_SUFFIX}.png ${CMAKE_CURRENT_SOURCE_DIR}/beam.png) +file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/beam_${BEAM_ICON_SUFFIX}.icns ${CMAKE_CURRENT_SOURCE_DIR}/beam.icns) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/beam.rc.in ${CMAKE_CURRENT_SOURCE_DIR}/beam.rc) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/beam.desktop.in ${CMAKE_CURRENT_SOURCE_DIR}/beam.desktop) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist) diff --git a/ui/beam.icns b/ui/icons/beam_mainnet.icns similarity index 100% rename from ui/beam.icns rename to ui/icons/beam_mainnet.icns diff --git a/ui/beam.png b/ui/icons/beam_mainnet.png similarity index 100% rename from ui/beam.png rename to ui/icons/beam_mainnet.png diff --git a/ui/icons/beam_masternet.icns b/ui/icons/beam_masternet.icns new file mode 100644 index 0000000000000000000000000000000000000000..55ea8da64b2780759fcebe40cb08b3f03664c747 GIT binary patch literal 32477 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 R`i9X_>VG4J|NkwK`#*S-1fl={ literal 0 HcmV?d00001 diff --git a/ui/icons/beam_masternet.png b/ui/icons/beam_masternet.png new file mode 100644 index 0000000000000000000000000000000000000000..854a0e27866e7176302dbcf778ea71e19de78ef4 GIT binary patch literal 37278 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 RaI^pb002ovPDHLkV1hYdzP11W literal 0 HcmV?d00001 diff --git a/ui/icons/beam_testnet.icns b/ui/icons/beam_testnet.icns new file mode 100644 index 0000000000000000000000000000000000000000..1ed2b96f2ac7d68f980333a3cff3c6a7229011c0 GIT binary patch literal 201030 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 S&igcHw6kuuFlX^?9+ti0J>msQF(s@y(k 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