Giter Site home page Giter Site logo

moneroexamples / openmonero Goto Github PK

View Code? Open in Web Editor NEW
163.0 17.0 135.0 20.14 MB

Fully open sourced implementation of MyMonero backend

License: Other

CMake 0.13% Makefile 2.87% Shell 0.55% Perl 12.10% M4 0.19% C++ 25.44% TeX 0.01% XSLT 0.29% HTML 0.28% C 55.52% Objective-C 0.02% Objective-C++ 0.01% Batchfile 0.17% DIGITAL Command Language 1.16% Assembly 1.08% XS 0.02% eC 0.02% Emacs Lisp 0.02% Scheme 0.02% Prolog 0.11%
crypto-wallet monero cpp14 linux webwallet

openmonero's Introduction

OpenMonero - a fully open sourced implementation of MyMonero backend

In this example restbed is used to demonstrate how to provide Monero related JSON REST service. For this purpose, a service called Open Monero was developed.

OpenMonero is an open source implementation of backend of https://mymonero.com/. The frontend, which includes HTML, CSS, JavaScript, was adapted from (and originally developed by) https://mymonero.com/.

Open Monero's backend is open sourced, free to use, host and modify. Additionally, some features were added/changed as compared to MyMonero. They include:

  • google analytics, cloudflare, images and flash were removed.
  • frontend's html and javascript upgrades and cleanups.
  • transaction service fee was set to zero (same as in MyMonero).
  • the wallets generated use 25 word mnemonics, fully compatible with official monero wallets (13 word mnemonics generated by MyMonero work as usual though).
  • import wallet fee was reduced (can be set to 0).
  • added support of testnet and stagenet networks, and mainnet without relying transactions
  • improved handling of mempool, coinbase, locked and unlocked transactions.
  • view only mode added.
  • Cross-Origin Resource Sharing (CORS) disabled.
  • ability to select transaction priority.
  • legacy address + payment_id system replaced with integrated addresses for better privacy.
  • free, time based imports of recent transactions added.

Live stagenet version

This is OpenMonero running on stagnet network. You can use it to play around with it. Please note that the live version is running on cheap VPS, which may result in performance issues.

Current development version

All current changes, bug fixes and updates are done in the branch.

Screenshot

Open Monero

Host it yourself

The Open Monero consists of four components that need to be setup for it to work:

  • MySql/Mariadb database - it stores user address (viewkey is not stored!), associated transactions, outputs, inputs and transaction import payments information.
  • Frontend - it is virtually same as that of MyMonero, except before mentioned differences. It consists of HTML, CSS, and JavaScript.
  • Monero daemon - daemon must be running and fully sync, as this is where all transaction data is fetched from and used. Daemon also commits txs from the Open Monero into the Monero network.
  • Backend - fully written in C++. It uses restbed to serve JSON REST to the frontend and mysql++ to interface the database. It also accesses Monero blockchain and "talks" with Monero deamon.

Limitations

Performance

Open Monero is not as fast as MyMonero. This is because it is basic, easy to understand and straight forward implementation of the backend. Thus, it does not use any special memory buffers/caches for transactions, blocks, complex database structures and SQL queries. Also, no ongoing monitoring of user's transactions is happening, since user's viewkey is not stored (only its hash). Transaction search threads start when user logs in (viewkey and address are submitted to the search thread), and finish shorty after logout. Once the search threads stop, they can't be restarted without user logging in back, because viewkey is unknown.

Example compilation on Ubuntu 18.04

Below are example and basic instructions on how to setup up and run Open Monero on Ubuntu 16.04. For other Linux operating systems, the instructions are analogical.

Monero download and compilation

To download and compile recent Monero follow instructions in the following link:

https://github.com/moneroexamples/monero-compilation/blob/master/README.md

Compilation of the OpenMonero (don't run it yet)

Once Monero was downloaded and compiled, we can download Open Monero and compile it. In fact we could postpone compilation to later, but we can just do it now, to see if it compiles. But don't run it yet. It will not work without database, setup frontend, and synced and running monero blockchain.

# need mysql++ library
sudo apt install libmysql++-dev


# go to home folder if still in ~/monero
cd ~

# download the source code of the devel branch
git clone --recursive https://github.com/moneroexamples/openmonero.git

cd openmonero

mkdir build && cd build

cmake ..

# altearnatively can use cmake -DMONERO_DIR=/path/to/monero_folder ..
# if monero is not in ~/monero

make

MariaDB/MySQL (using docker)

The easiest way to setup MariaDB is through docker (assuming that you have docker setup and running)

Create mariadb container called ommariadb and root password of root (change these how you want).

docker run --name ommariadb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mariadb

Create openmonero database called openmonero.

cd openmonero/sql
docker exec -i ommariadb mysql -uroot -proot < openmonero.sql

PhpMyAdmin (using docker)

A good way to manage/view the openmonero database is through the PhpMyAdmin in docker. Using docker, this can be done:

docker run --name myadmin -d --link ommariadb:db -p 8080:80 phpmyadmin/phpmyadmin

where ommariadb is the name of docker container with mariadb, set in previous step.

With this, phpmyadmin should be avaliable at http://127.0.0.1:8080.

Nginx (using docker)

The fastest way to start up and server the frontend is through nginx docker image.

docker run --name omhtml -p 80:80 -v /home/mwo/openmonero/html:/usr/share/nginx/html:ro -d nginx

where omhtml is docker container name, 80:80 will expose the frontend on port 80 of the localhost, and /home/mwo/openmonero/html is the location on your host computer where the frontend files are stored. All these can be changed to suit your requirements.

Go to localhost (http://127.0.0.1) and check if frontend is working.

mymonero-core-js (optional)

OpenMonero uses frontend code provided by mymonero.com. Among many files used, the two crtical ones are binary webassamply MyMoneroCoreCpp_WASM.wasm and the corresponding JavaScript mymonero-core.js files. They are used by send_coins.js for providing transaction generation functionality.

OpenMonero provides these files here: ./html/js/lib. They were generated using forked mymonero-core-js repo: https://github.com/moneroexamples/mymonero-core-js/tree/openmonero

However, you can compile them yourself using the orginal repository located at https://github.com/mymonero/mymonero-core-js.

Below are instructions on how it can be done on Arch Linux.

git clone https://github.com/mymonero/mymonero-core-js.git

cd mymonero-core-js/

./bin/update_submodules

npm install

# download boost
wget -c "https://dl.bintray.com/boostorg/release/1.68.0/source/boost_1_68_0.tar.gz" -O /tmp/boost.tar.gz && mkdir -p ./contrib && tar xzvf /tmp/boost.tar.gz -C ./contrib && mv ./contrib/boost_1_68_0/ ./contrib/boost-sdk

# set EMSCRIPTEN paths (for this, you need to have EMSCRIPTEN setup, e.g. in your home folder)
# http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html
source ~/emsdk/emsdk_env.sh

# compile boost
./bin/build-boost-emscripten.sh

# compile mymonero-core-js
./bin/build-emcpp.sh

# generate mymonero-core.js and MyMoneroCoreCpp_WASM.wasm 
./bin/package_browser_js

The above instructions should produce mymonero-core.js and mymonero_core_js/monero_utils/MyMoneroCoreCpp_WASM.wasm (both located in ./build folder), which can be used in place the files bundled with OpenMonero.

Run OpenMonero

Command line options

./openmonero -h
openmonero, Open Monero backend service:
  -h [ --help ] [=arg(=1)] (=0)         produce help message
  -t [ --testnet ] [=arg(=1)] (=0)      use testnet blockchain
  -s [ --stagenet ] [=arg(=1)] (=0)     use stagenet blockchain
  --do-not-relay [=arg(=1)] (=0)        does not relay txs to other nodes. 
                                        useful when testing construction and 
                                        submiting txs
  -p [ --port ] arg (=1984)             default port for restbed service of 
                                        Open Monero
  -c [ --config-file ] arg (=./config/config.json)
                                        Config file path.
  -m [ --monero-log-level ] arg (=1)    Monero log level 1-4, default is 1.
  -l [ --log-file ] arg (=./openmonero.log)
                                        Name and path to log file. -l "" to 
                                        disable log file.

Other backend options are in confing/config.json.

Before running openmonero:

  • edit config/config.js file with your settings. Especially set frontend-url and database connection details.
  • set apiUrl in html\js\config.js and nettype option. Last slash / in apiUrl is important. If running backend for testnet or stagenet networks, frontend nettype must be set to
    1 - TESTNET or 2 - STAGENET. 0 is for MAINNET.
  • make sure monero daemon is running and fully sync. If using testnet or stagenet networks, use monero daemon with --testnet or --stagenet flags!

To start for mainnet:

./openmonero

To start for testnet:

./openmonero -t

To start for stagenet:

./openmonero -s

To start for stagenet with non-default location of config.json file:

./openmonero -s -c /path/to/config.json

OpenMonero JSON REST API

Example JSON REST requests and their responses of OpenMonero are provided below. The long term goal is to make the api conform to jsent specification which describs successful, failed and error responses. At present, the OpenMonero api does not fully conform to that.

get_version

Get version of the OpenMonero, its API and monero.

curl  -w "\n" -X POST http://127.0.0.1:1984/get_version

Example output:

{
  "api": 65536,
  "blockchain_height": 965507,
  "git_branch_name": "upgrade_angularjs",
  "last_git_commit_date": "2017-07-25",
  "last_git_commit_hash": "456f9d6",
  "monero_version_full": "0.10.3.1-125f823"
}

api number is represented as uint32_t. In this case, 65536 represents major version 1 and minor version 0. In JavaScript, to get these numbers, one can do as follows:

var api_major = response.data.api >> 16;
var api_minor = response.data.api & 0xffff;

login

Login an existing or a new user into OpenMonero.

curl  -w "\n" -X POST http://127.0.0.1:1984/login -d '{"address": "A2VTvE8bC9APsWFn3mQzgW8Xfcy2SP2CRUArD6ZtthNaWDuuvyhtBcZ8WDuYMRt1HhcnNQvpXVUavEiZ9waTbyBhP6RM8TV", "view_key": "041a241325326f9d86519b714a9b7f78b29111551757eeb6334d39c21f8b7400", "create_account": true, "generated_locally": true}'

Example output:

{"generated_locally":false,"new_address":true,"start_height":0,"status":"success"}

ping

Pings a search thread for a given account to extend its life.

curl  -w "\n" -X POST http://127.0.0.1:1984/ping -d '{"address": "A2VTvE8bC9APsWFn3mQzgW8Xfcy2SP2CRUArD6ZtthNaWDuuvyhtBcZ8WDuYMRt1HhcnNQvpXVUavEiZ9waTbyBhP6RM8TV", "view_key": "041a241325326f9d86519b714a9b7f78b29111551757eeb6334d39c21f8b7400"}'

Example output:

{"generated_locally":false,"new_address":true,"start_height":0,"status":"success"}

get_address_txs

Get the list of all txs for the given user with their possible spendings.

curl  -w "\n" -X POST http://127.0.0.1:1984/get_address_txs -d '{"address": "A2VTvE8bC9APsWFn3mQzgW8Xfcy2SP2CRUArD6ZtthNaWDuuvyhtBcZ8WDuYMRt1HhcnNQvpXVUavEiZ9waTbyBhP6RM8TV", "view_key": "041a241325326f9d86519b714a9b7f78b29111551757eeb6334d39c21f8b7400"}'

Output (only part shown):

{
  "blockchain_height": 965512,
  "new_address": false,
  "scanned_block_height": 961405,
  "scanned_block_timestamp": 1500969813,
  "scanned_height": 0,
  "start_height": 957190,
  "status": "success",
  "total_received": 32594830001895764,
  "total_received_unlocked": 32594830001895764,
  "transactions": [
    {
      "coinbase": false,
      "hash": "2877c449a7a9f0a507c7a6e4ae17b43d96dc44369092e57adc4e6d9ddcde1a68",
      "height": 812669,
      "id": 831631,
      "mempool": false,
      "mixin": 4,
      "payment_id": "",
      "spent_outputs": [
        {
          "amount": 13659082425875,
          "key_image": "0b6a04e1a1d7f149a8e8aeb91047b8ab4722de50554b88af4ed7646fd1929947",
          "mixin": 0,
          "out_index": 0,
          "tx_pub_key": ""
        }
      ],
      "timestamp": 1482567670,
      "total_received": 0,
      "total_sent": 13659082425875,
      "tx_pub_key": "41bd5cb51aa26fb58d41acd25711a7ecc2d19be0c24b296a9e362aebee61d4d0",
      "unlock_time": 0
    },
    {
      "coinbase": true,
      "hash": "1f76938b4deceb9e0722f02f4477006d3e96e2331552f726c47f297977434b9c",
      "height": 818908,
      "id": 838719,
      "mempool": false,
      "mixin": 0,
      "payment_id": "",
      "timestamp": 1483311688,
      "total_received": 13388479628538,
      "total_sent": 0,
      "tx_pub_key": "3c71217add3b7882e8370fe6b903bc48059a79580af5e095485afc88b3126d09",
      "unlock_time": 818968
    },
    {
      "coinbase": false,
      "hash": "53cb70ded276fbfcc68c98a8d9577b42c543bf1094d6cbb151fa05c9edb457be",
      "height": 818921,
      "id": 838735,
      "mempool": false,
      "mixin": 5,
      "payment_id": "",
      "spent_outputs": [
        {
          "amount": 13683584012406,
          "key_image": "437518836c315bf989c5cc28b935280345ed672d727122f6d6c5c5ff32e98224",
          "mixin": 0,
          "out_index": 0,
          "tx_pub_key": ""
        }
      ],
      "timestamp": 1483313063,
      "total_received": 12648774828503,
      "total_sent": 13683584012406,
      "tx_pub_key": "3eac7a5ce7dc0cc78172522cef4591a43b0e9aab643ac3b57554fd0dbc8ba86a",
      "unlock_time": 0
    }
  ]
}

get_address_info

Get the list of all possible spendings. Used when calcualted the wallet balance.

curl  -w "\n" -X POST http://127.0.0.1:1984/get_address_info -d '{"address": "A2VTvE8bC9APsWFn3mQzgW8Xfcy2SP2CRUArD6ZtthNaWDuuvyhtBcZ8WDuYMRt1HhcnNQvpXVUavEiZ9waTbyBhP6RM8TV", "view_key": "041a241325326f9d86519b714a9b7f78b29111551757eeb6334d39c21f8b7400"}'

Output (only part shown):

{
  "blockchain_height": 965513,
  "locked_funds": 0,
  "new_address": false,
  "scanned_block_height": 965513,
  "scanned_block_timestamp": 1501466493,
  "scanned_height": 0,
  "spent_outputs": [
    {
      "amount": 13683584012406,
      "key_image": "437518836c315bf989c5cc28b935280345ed672d727122f6d6c5c5ff32e98224",
      "mixin": 0,
      "out_index": 0,
      "tx_pub_key": ""
    },
    {
      "amount": 13683584012406,
      "key_image": "ac3088ce17cc608bcf86db65e9061fe4b9b02573b997944e4ebf7d8e64e4a3b4",
      "mixin": 0,
      "out_index": 0,
      "tx_pub_key": ""
    }
  ],
  "start_height": 855633,
  "total_received": 13481878608141995,
  "total_sent": 4699871131811773
}

get_tx

Get details of a single tx.

curl  -w "\n" -X POST http://127.0.0.1:1984/get_tx -d '{"tx_hash": "bfbfbb3bfa169731a092891795be1c3c923a018882ac0efc0ed3e79e2d2b2e54"}'

Output (only part shown):

{
  "coinbase": false,
  "error": "",
  "fee": 22893920000,
  "mixin_no": 11,
  "no_confirmations": 2898,
  "pub_key": "b753c863c64565ae81630bfdbf497f06955b6ce041f656565809d04be6ef9343",
  "size": 13461,
  "status": "OK",
  "tx_hash": "bfbfbb3bfa169731a092891795be1c3c923a018882ac0efc0ed3e79e2d2b2e54",
  "tx_height": 960491,
  "xmr_inputs": 0,
  "xmr_outputs": 0
}

get_unspent_outs

Get the list of all outputs with key images which could mean that the outouts had already been spent. Thus they can't be used again. It is a job of the frontend to filter out spent outputs based on the key images provided.

curl  -w "\n" -X POST http://127.0.0.1:1984/get_unspent_outs -d '{"address": "A2VTvE8bC9APsWFn3mQzgW8Xfcy2SP2CRUArD6ZtthNaWDuuvyhtBcZ8WDuYMRt1HhcnNQvpXVUavEiZ9waTbyBhP6RM8TV", "view_key": "041a241325326f9d86519b714a9b7f78b29111551757eeb6334d39c21f8b7400","amount":"0","mixin":4,"use_dust":false,"dust_threshold":"1000000000"}'

Output (only part shown):

{
  "amount": 2746682935584926,
  "outputs": [
    {
      "amount": 2450000000000,
      "global_index": 86136,
      "height": 839599,
      "index": 0,
      "public_key": "6f6a4023bfa407ca1ce37f7382d5ea7540a330575bd570094b5add5e8ded2dd9",
      "rct": "4aca9e9b9a5d63fcf409ac28191696cabb78c0ba14791152509ebe6db7f9311033a1dc75d69a1dad7523f65856d07487aad2bee2098f5566b6d92ec5a5c68f00653d241a9d7f16ff13df87825609e8b2353ec20e50d11f8133d234184d9f8b03",
      "spend_key_images": [
        "2818dae0940fb945185c562fcb0a496f3c3b551f33b7ddd7ec1b5ecd856166e6"
      ],
      "timestamp": "2017-02-01 05:53:28",
      "tx_hash": "9d17084091beedc55c8a0cd342e441b7c0d89eeca25ac151b4b91fe1e12051e7",
      "tx_id": 2117,
      "tx_prefix_hash": "849f11f6b012c1557f87692ca7a67bcb24a5a553078c4faed870b8982821feee",
      "tx_pub_key": "4219b1004fa64bde0213bf3c59b9e160af8603be03d79e13148c15fd598e3a0e"
    },
    {
      "amount": 10000000000,
      "global_index": 86550,
      "height": 840011,
      "index": 0,
      "public_key": "5506e8786b7634a77487f0938a00d3de6ab005e2f76ffee05fee68d5165382f1",
      "rct": "6f78720d6bb0287d78c50bfa41332232fbc4bc9b7f04e35681ff926cc156b1fbfb3b84a2dcdc8cb98b33be70b302e380944abc3e7a7cbf3e27614936eccca40203447622e149ba1e09a7062eb8910acf029f561ecdaa5a34e076baff5d63770e",
      "spend_key_images": [
        "9c82226bdf165fd2424d9a0ead661682bfab2fe644cd0bcef575ae16595c550c"
      ],
      "timestamp": "2017-02-02 03:18:18",
      "tx_hash": "8257367ca6def69dc3d280e8909c3cd01b230fc9922c9a89217db06f3fb41102",
      "tx_id": 2118,
      "tx_prefix_hash": "781a0ce699865987ec78ad331e8e89c0d14461f9881dd11a7a4541114b567568",
      "tx_pub_key": "29ceefd594b856c7c06d2423be17cd674b97d1d8f72907ace8d27f5b6aa9875c"
    }
  ],
  "per_kb_fee": 2480631964
}

get_random_outs

Get random outputs from the monero daemon to be used as ring members when making a tx in the frontend.

curl  -w "\n" -X POST http://127.0.0.1:1984/get_random_outs -d '{"amounts":["0","0"],"count":5}'

Output (only part shown):

  "amount_outs": [
    {
      "amount": 0,
      "outputs": [
        {
          "global_index": 48449,
          "public_key": "637dbadf193fa9fd5c50c96af18f458a9b7d4844fdf7ffdfa3f62d51d6aff835",
          "rct": "0c908e1969edfe7824560104e44334b46ced17c9462eacb5aaa70e62ea34a394837c07d14bffc5a65e2dd14da395dd135bcc2e5ac70648782d76e4a9920cd007b9ffe319b796c555fb7713a270f21181a5ee5c8b01259becba0dd332b93a6c02"
        },
        {
          "global_index": 67558,
          "public_key": "6ca3a73512dadd669430f73809c949f3edf71728bea5201441c648c2d128c453",
          "rct": "999312ca1914895cf8a517c91a54a069d8fdc7205d7768173618e77fad2fde5c725604d666b101c9ae19c72e07cf5f821603a7b63efb5dfd8a7c0e36ed0c250fa92929cda49ddd0d34e664e15634ee59e958815764ec979b5ff0a72b3af6af0a"
        },
        {
          "global_index": 102186,
          "public_key": "c29d43f5d7c71a6f1b4f3286da3c296a083cf68728d85c268ee0c964a6c8c00e",
          "rct": "23aa82efdbd0c6878060496a13f7a707a6f45649b51de12d54d0cad14c5be5bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "global_index": 96992,
          "public_key": "fb83d74a42abe65d5b8a6a906791202376b91e3459a31737ac62a401b7b9356c",
          "rct": "975b42f50cabb801091c90a4227bf7ba024ddacfeda7e5e0383f034b0bc8ba2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
        },
        {
          "global_index": 36848,
          "public_key": "2a8785e42a9446785cf189a40fca8f56a592dab9db1f38f8e8a3d2eb84b680ff",
          "rct": "a09e27b83917792bc8f6c51b40077aea329bf08b569e63657e2ac3529db5d0aa14f9f9fc45930577b43829119847ac857d69c00d12859a903cfcbf470819dc00b1bfa43aa979e46a0d0476cb36717e8d8374afe9af1fb3715091147cc9587e0e"
        }
      ]
    }
  ]
}

submit_raw_tx

Submit raw tx in hex generated by the fronted to be relayed to monero network.

curl  -w "\n" -X POST http://127.0.0.1:1984/submit_raw_tx -d '{"tx":"020001020007bdcc019e8401806af20f8d0dd72cab40d8b798c19cbff78ac28bf6b7a2141e8ddd2af09a669440c4983e2c7bacbd4f240200027d6a157b6d00e3175c604cdd7f9b0d537b1ba4b1c949d60ce68c644a6ab037d50002251f9554df370da5e50900e38f207a43bc0e131f560238a42bf20166b48300f62101a00552a9b0f7b18526965cf510a1531d65439ada0c3c7f32d3f4959cace001f50180d1c2a0e501123ca835307de9442233acb55d346bf36a1d150e34525a8cc7bed0a6a08ccd09f76aadc775cb0dc836a802e81fc5dd1f3d4157f1553a50e7e4e0987b21963900d8607d200a3753897e958caf0b4b3ff281995fc1c37f8334492db83b6cd2c40d16dd2266d741e67d9a672d27a00cac3e028addc19f2e21d37ee9e44c68291300d58fd455e3bf47404453605b410848a8cee68bfe1124dc55126e1dbc4acce3adaca5c9b7a041c708ba1eb6b97d762c28cd8b1619cc6128f0d8ccb91765f3ec93db17778c5f480d5ca3142b91627e3c9016580a7f44ec07ff850dbb4960f63d02696b2a632c54ec7f4493b2f9ea49dae525a2b4335cd8c7770753b10bb740ab0f281040530588a7a6f14b5bb6d763d1434dd4e065142fba2172bcc92cdd1d410487fc9394cfe740452fadd9ce3cb0d7bd5dbd5443ec80d37fae0598d44d270c065ae041f4d3bc657ef3ca2e1b9ef072bfd8ea79e283ef8e2c151c6ba0a0dfbf08b332b8df37d7db48fbdce1bc50ab6d47301f62bdc5c5f7f9bbc8cf9ac4d254075b44d008d30a9539ee288c73d126ab6545c6e5f7d902ce61533445f184bb840db8ef0ebe6a34ad48ae5d60a0d1d542658d5fce93b28bbe2d9c7c330f0b82cf009d5dcbcf19b88a91c7cf82af78591fbde26a2ba9732674393a3e55faac33320d9e67c14f96d75faf24b7fa8e9eb9bfcf69a7157c0578c1b61df912b2aafdbb0a1d75551ae84ac72bad62bb6b8ab9ab1b4528dff0a8d8f30f791c07a8339d1a0993944136122f0afae3dba4b77d75d93d4116258cf2875251522ad3f57d2f01074433ef9a06738e9571c77dba72921a8dc8a313d2a88473d9f117e19535db8a094126cce97c097d0fc344f110ba3b6f31f7f11f8aa3790ac9de80abe9166caa021ef71cd41752d4da91fea2a5b9bb80e1ca11b651dcd5d870da16e383705c510c2beec911c63c2bd60221145d5523d141cdd7f1144b63d8be16b6290f49beaa06d0250071ff9885c2f8ea02a201ec7f42e51fde3bf1ee3dc87caeecf6f8efc70ebf30d7f3914ef26659dcd6d274c1aab82765b76cbefad53b6cfb02622416d9000b55ad09d0d99a00f68136260fe1f1415054d8b7fdab61bd324167d1d327ef08081e2c1e535a8446bff64c618ffc1b343e4f6567efa11ff9f864c550e553c60eb390f2ac408209c1c0e50de3bda3f003dab4b5c50c313058bcdc1eb65d949501762c3675fa5d9bb1e901f3dd82f42dab0ae841f348babe25770b8ecd49edeb095e57f341b898e646ec4486f715d0fbce212aacbef82b0366dbb0b4bf88dc36047b79b3e3bcaaf5e3efb6c5dbbfc3bb0f18be231550a4d0026e095e7db835570a62fb425ac1c933471a60508541b25b7556a3333a9ca6ec4a5d3ecedb00a7c8041612003d2523bf61a02aa633874aced4bae10fcc52fe0ffbde5b2acb21a6590fa1f75bda400d26715a81dcfe2fb150d1e6de07c076e4e5c22e377950405f020a902242dde89c22d7fdfd1fbe0ce4d216d131a1e8af40fc6f4516bbae44102a0bf73d04baecc35bfc83604a86eaff58d8233c9af9a7c31a28842ae7ccfd3036050ec770fad79e0be63e2d2f1a8d7c4f2d62b1ebe1d8ce3cc8514042eebcba320248752e30005f172fed893c9748038506367dcaeaf06c31755ac916864e0fe1048825f236604b116d583651b6779012d165041b36504fb937cecc788f721f860ea53ab41168ac80b6dff2b8007a95e6c8e131c77405c8dd6670b11d32b2a6d00d72d753459a4b636e04da4d9e0fcfc501aa1097c4a7495d6f6ab60cd0c9d3900c6bb1c06e0fa5129f8784631943764a3452f77211d52dec5036bebb5450f1430374f35a1b6399ba72df166bf67e9e4dd198dfa48527fec2f5c6c738e37e24c3044aef06e2bd80e9ede8afb12d8cd2d674c6b9b4c1131b5acc45431b009e468504d9a7b066f008c82dc3081cc7ea333593970d32e893e28de127363ac4f722c00715b9390b7cd7fc0a28a622011428839e49948ac387793135f1b73b9eb7b84e0a82104a47ef231ad4bc164dd40060493d7b1d866a975a3dd98c07678e34a7120edbb305097c1148b2a9baadc7f3874a05c72b97a363cfad232c885eeb6d00be0036df0f06019244264efc4fd63efe0ecf7a3607f6cb07c3c5d0fbbce459c86b0a2202c25cdb9fc211ad458174ee75a392b1cf08193c5534a3644732ad4bfe46035b9126d95db6254cbdc3e78d873ca7ca1e4416761bde4bd8a91be1320a8cf00d6829938d196dfd3a85598faf2f4981884422a387dbfdaf6783b8b89a7318140ed2b8b339b26e7a8ddf0a78b12055db5bc8c2a2465480c3eafd4d01c2f8e754088cd37da11dddf103a58ee2c96994499dd67139a478aa5ffeb39277797761710ffecf3efad111588b9a9dbbf46bc64e504361cc042b98394bbbba394296e75505949ea033ea3358d7fb343eacefdb0557d8058762110b94e8a792ce55adb6ed0b49528b1f2fe5d6f3be2ece6a355dd741d1bf41c80867a0e6738d96b6c127510c6b2790f4a444896c9f176e52b70de4c5a1ee4e6a3e5558a96786957827ff2700a3ef377178ace3d4678ba4f43987bccbdc4dcc07ba93ba0a5fdf43629ed5a70aff5e4bc17ac814e5c33e8a394a36333ab95f3551b62d17a68514dc6d27cdce034d78641e034746222a3ef07682881fb0244eeb91858493c29185fbecd2353f06ade9a99f69a79cdc8cef819436952800d6cc921eb04a9db6e78b1255eeba4e0222e038c7cbed178e549e2b9781f4b1b05d324ecffde6213bc61c3c17dfef8e08313fc8f2a877b68d1a1108f1e99727178ce1b85eccf6f487c9cc4f4531b3e3010523c8aaa61e8917f2afe2731c214742c77124a77b56e99dc071cde39e3f8a07a74b417c65ddb1cc995da7dcacc36262faf68cf846cf80f6ad0980650643c305e5875b36005f0604cf5491b2aee281db708f0516f56fe2089f3fd4c0b1b1ac04579bab149351185b8ca1bdc83f4dfbf1502516592de3612c6d66c825d0405102ae6163cfb64d173cd7fa661ea5f67302eb2e367e4fba402f2d2c835b6ed2380a6a1e7fc6ee876418a74d36494cb849354d246ab98edd90bfa25d06db67463e0f02c1c4a9ff4025e2de4bc9920d4f03f72fff14f4f9d495a6dfdfac7a2b5bf10b4b7a7e0b79175659d081c15390821fda49d1867e0bb1ed5d33d46a843958650103ce9e348eabe90a8e14496d982df58a8f86a16d0e35335614a81068af32be0c7681f6e01918d054c7504f3a0febd0a96ea958f9c604ba45a0b4d0480ca51f0692ca08a55772b7e43039bfe54ed41f8b565e0b74b35f00be8e8287e84411e5041fcbd6bbdaf3a472b9a2c02163649bc46032aaee580dba8a66cd488c12b62e086fc193897ff55b6777ffff75cdefeacb1be3637941ada1264cd7b9e55088c20fb7cf9f83553a2c03cf985786b564cd89217d69535d6d9ac6c305b43872ac0208d5ba9863fdadf5c1f47a0e76bbd6e2945591e2cdc41b1d9ad5c285a206e00205fad4a72194fd040193dd8bb70709c6c37126214d49b7375e4b76cfab3ca4e00f7f059eb6ab01f6c10144b085ce52c48abfb6de9b9c7e0cbbbfe148802af1090f342ee99a166ece18116eef2410c97914bf482e563b00146958c49feaa7b6740e2feec083e7f8afc88a9f2247ea44743abc8f016b598f22657851f46d92cf7a02fc3f9b31a49195697b196622333a3a25467b0b6e947843199ab257fb92d8570e8acac0c29b238907a6faacc6afd0dcbf92fdf3b5f63cb4e74bb7f0609f00e00b2c083c6375d788fb490fad270830b01ab6a3e23ece2e37ce9460d3ab36d8da0a0504fb87bcb311f0edf860a03e7033f20600d2a77203d808ef64ea07d5b033047d8d21751446f26f4890120486686949693849ecae493ba6c6f361243729770fc9fd87ca3471ff4352787acfbe51822c2ece02c4dea1fc752bdbbaed3749080ec41b593b36c7f55743452be56276fed4504e0c3723714eb67af8af6b4000160f5a628bd1e7bc4dfb31ef9744d6a10f250185132244b4776502a59153b210740f075631a56d45e72edbd7644446fd6ea66635925ee7f9e77aca0917bd569eaa0a70029e2a8ada8c94465ade6debf4290c3eb987e39fa63988d8a34c61bb1f2e0c01b9c673a464176c4f012e372f7fce51ec78074f7ac08cb455e81e6e77710e014d1285c5d3de89a9e59c0735055b310777c63d2d69f9524698b256ab7aa9a10c8886522d7e17a98faaa274c90c00ea83fb575ece80aa7002e4a340d229e43c069737335e67790785686d2cdbe95d24eeca499f2d6405277a972d9e571788c406629d172476d708d82cccecda373f84e72ae6c370a1d9606c4a79bf2ef95a7609b3c8b6d74a6989ee44137f791655d9bd286b5d6dcc18eaa6c3661703addfac03e1428e91bb031f54ba9d672fc3fc1008496ce7a0fff161dd356bccad1b864d06d26475368731408d52fe91b10cc79557718ca636fd5f1bbfa47471416c6dd308c870b1cce41ecd0bc6be60c029911971f83b40a2df1691d75413cdf6b475d00efb701551d462645366e46f07c1c87aa84e8826f12b66351a4d13ba73cae35c0632525a0dedb1db82bbee0ed295458b088bb217b7029c4788230cc00a429c9b00b073f3ec3307b1c6e86f491fc865e1df3159e2aefeccc5108c2b5315caffed0bd40ae571f84512b3473718f48459dc8f394210f18b35203038188e72acd51607246422196e958af8c1add8155587120ed7678eb3971d2d6c15dde3a063ffe80d4b400f77392c3012561e8dfd4ecb236611d5ecfb51beb98f8b9355cdffdcee0adcf64a91469ef2bb8537f37ee029c56b3ac33f7539f139cf57df1e2cada2950f7e066a5a5d4d852ca9e7ed0c5788031197cb14d5026572579804696259f0a40c8c179cded9274a8fe739d4741fb865907fe81ace963cd7f8486259bcb3390a0c8d1d85a2801bcb69bd51928274dc1c68e78d8d98d6a3e6a36cc510e1ab6f200e7d43ebdecd717502aa9c1b7fd49e3f7c8008fbea25867b7d34117b62d75a61051185f0793838ef3792f95e2b780c2f3231bd149ac218479331bbbb27994acd053f9a52a3ad961d450a7d393d0034424d1c4355814f40dc7950d6812b23416007ebb0f66ce3b26bdb165f06cc8aee50c6dc15ad2bc424e36291a63674052fba0dfbbd3c840df9d19cb34852d61dfb31f78e3336cc6ddadfd7414e43e3f56c820a0b594cf7e46bcba2c7f347ec8d7eb9b7ff01e4d7e854d36be871f9c90039570928b55c0b70d3d2865775db1b17ea0349d0dee1cf129d26ef2614d149aac09109b382c936ff05e3e3b4bb654d43213dbcacd8169268f4cf7a6caaf24e3fc23d077607d9d24eeb0984e5e786082f0e6ea8baf3a628d95bf6cad2f272d220c88202dbbdd627a41c0518117d791c1dade4a182dcb58625599089be70153bebf1ac03fb028d23d0bf5da5e263212824f0ab54df97d02c8dff205abfffc8388e6839076ea0cf5e82318b6b303fee4d2f0c693d26cde78697d7f873abccca3b17dd28079fdcad94a7626ad4247347adf09a7df8108734a42608a683c45342081a128d0e84287d2bb39ee38ff309a22b779e9e4212e0ce902e46c4027a3e54594a2722083029ee2d323859592d88a9a82c79ac02bffd1202292e439ab178cda257dc340c947ff311f8fd6521f06ec23d7adfb45afbf2de781222a90d7a093f8fe3d88a0b2b3c558f4c8d9044020468341dc6e5bd8c5127f14944d5e63eeb2ad621c28500cd22babde8135f24a233964854c6791d03b5d10baff06cf084bd8fdf7131e50ce90e8c03f0e1dbe59cb5a9f40671f5e50b549f71df51bff3412c4fdcc5b0ed0e7c13306434ae9a75e8c33bbbf70f2ca9147b74668e7f5fc92fb016ed880dda0387042e836a71e4cc242aeddd4b2e5ffc526977ff97c0417190bf21935e364104c6c405e231145425340e3f813aaecfd55eb0dc500f9d5763547e7c5cdc4f8d09aef7dea9874673ec1c7d66ffacb50171f2db96cb0ff3b1e4aa306127a7c1130d34516baedc1f08a9f8feac28d2869c18ec03b57ccdae921a3620708e4cb34a0c570d766e41373a08e15a998dea56e1f38168eb6bc575a72a9f4f09dece13e301ccbc34e09f0bbc5bb8b93c1496c45d7bf1f92b7e92bf0d33bb9a53e91917d7fa015e6dfce17c0ed88956dd2223501475378de03d3814dc51ceef4633b5be4de5d2039ea501fce9f1b15700dc769abdeaa2d761894f39149caeb2b1a1f9a4a5223ee2aa9b1e51f826368915621b4b389cc30f6a5be8150e865f0cf5eeebb5b76cc2bcc8d03262297d2f5f76ef81ed57b8c35fb7ac9cecdb4e6ce416a2b59056b6ee899c3dab7b0b1de217cc1fd2d621ee08204f776066fa3dddcb3619fece373660f888a631918532096fdf11d4fbf4481c0fb9a625a6508ec0d74089fbd9361ecc312f7739a3fa47589a0e45e4eedbe9bdaeb7bdf6f02c16af4e953f58d45f531fe06849ddbc7fb29095253271cc7e4f7e8d3f8fdf3826ad393704aacdb31b1c26e99301db5a4be4ae9a4e622d4cc90e8cdfa06ed8d4c63b8a7fe03159dfadbada037380c94929d52970c59ea4506fec41f4b02bca6388a15dca18368279ff305fa8422057e57159819ac46ad83b8ed0f036287ed46be9c55c66b62affef09b6bf131285d01bfc6b7ea1a889675c7c3554779b7589b49eee8b7471e79ddff860c10f1db5ab64ffb84cf987ca11735085530b1fb737f33119779c4811ed857f6e4c2fab69fcdc2ffb09c410eaf9353b63004ffddf6cf954eaa97efb55cc28c12e7195af37ff93cf75076af42aef805cc1b08872d634089dd22e8fc6aa735b11cab1c7d2970d6abcd9d2cb55c2668151967175882ee21440481c3693fed3e2b59307c5050ea5e408dfe921dd3bf49d11d0ca4c346b8d97d233671e3f67702fedb207b32a48bcb96860519dd9285680d9973e061cbaccdfe631f172064fcffeab97271eb6e39e8dfab3f84b814328c3bb118331118668e4bed87ab5b170091a59d0f9d0f7d47bd0d0209d785af826394287fee4ed427bdda582538c18f831a051032a04873901b7c729e89817e4b9be90b72dbc8105633de806e13b239592faefd7a1235d87c50932e351edcce8c70b694b98e0a0c154fcbe189d454648204a28ff84ea021a2143c8948e06ae0c9a3111d4697dab1c521e12198c1d299e32d3b5f9de6871816ab653d93cb97378178fc27d7b21b905131e7d804ee8186d698b474f41e7509cdd724a3b5b88d7af2637f6d4905184c12b6ecd97b584ecc6d6017eed9018d1bf48e08b0cb75e288a6e122b8f9b5a47f5e497c5389abc8e264c85b8d5883e387be88ce55ccf263212d59cd908979a6c61fe72f65cd059c1c30abbe1d23da5d8f56ec2a7be3a6e02638bff117e0e132d3c41046ef6b040715b7ded2764ad69c7bbf8d339cae8df63f25870f3968c08fd3c81d97a7b9da2b178f999ed11b6b78939ca407bb6212ade2b2bbc41b132f2572fcce3b4ed9fce3792749c79a09dff61bbd29335fd72b54b5049614c6ca4c767bcb7a9e7d48fdc5886602d99163b5668d1b3f57d71dc4e5b0c21b3b4dfea83a9d3591f54e5981525d02701db090d0f9e56149069731f01ecb4034d91bbd059d980d439d4507a1a47d574c90bdc0e4e4530d37e94f00aa11fc414690eb18cd8516960381fbaabb0f4bb278c8024280a3ca0f592860b9eb6a9bfe6dc65e43c220f1cdd76b4fcbc7f895dbaf125517d4a3efc93a062d6fa866c306d9130c9320072cfff46ff1ee7873cf15b558080ea8b447362ba2f2d61fd367870309e3cadc5202f93f9e4760dd10a7ef117d9508cc32b6e7a19ec8f5a2f8280d8400dee92a84d4d853abb95b2fa8f557775522d456e9f28c132db5c35ca0e536dbbe17191b63c79d5c43a41b23a2b6cb1d6bf9ad87195c5bcc0b2a375610809c5bec4949093040963426606be988b8101395251751518827a57527d90684eaa56a088717f1fd2a691319a1e6f4814d626071302d971fff30558104363f6a28fc6f3b8bc1239d32cfb8523cc42144e4c81bea7955a151cfd47cf9c0e05926bedaf266b93da7bb0c7adb512b67b168172702b7a6ba286065cc660637419ac47d669899d88cdf4f45d7fceaf7ec7fc996d60d4b41f208c197bfffb04e9f4a2d0ea5f215ba7aa20bb1aa6539cb615daa30c8ab0ba89625067e7040f68f1ff8f113dea1ce1043679284a70ed2a9f4308f0f6341d66f80577bc5df43176fecf126c226d884ccd1b511337b8cfa19c7c339f47147bbb9672b4941e2702e2f439623fadfd79e8ff81edd22706c4dd799b55f5ca6343b14e9b7590bdc7bf6ea6bb4e7c6d0358719188509c11013c3dca2d8d018141b04aa4ec768706c0f89c4d9aeade36a723cb44f42f5b51ef54aab3b503766b852985fe23636561e153c1ad55cba3f3218b4dc35be2be0b8ff3c8098f0846a2f9a59d7b80b2984f51913914aa6d2e0000b73ddb7e871f00197dbbdab1fddd8e697c2237eb48703746f0b13b68d5bdaf32984cff4fd12b02e562e62942249312317f12432343352a6f998482dda10b6b36caf7aa08a9be16d9dd05252bc49258bd07ba86f32f2799eaaff0ecccf027563fdd81dcb9770fa3e67929e53f48d7869a801a67b0d47c4eb885e9521c5d55361679344df5dc13e27f27e9841beca192a5d13e3f35b5d1d810f0612ffebc122e5331011786d752f2d5987cff285693c44f7face817b77b107ec6407c169a98dba9ed32d4993f21c33b3a20a9017b7926cf71068334373f1b5fb9928a0ed23a6fc10f72b3e2410909346da69cd667f8aa5de180c94bad1fc009b1cbc2f8fdf0b8ade07f192bc30932b9e88c0ebb1623f9719480de0ad26fba2daf412eb685c7ea7dc59d2c10f4e2c4b8f2b402cc5f24f23a9c5b04416431636415bda065fa0fa36c705c3ac23c11275078623e9c90b5909df108132e7de527a9e7c37f1dcef356add96f917be2f8e83eeef6a28d722bce6e219002d0389fff016e7bbadfb777ce056c403271ca083dc2f02f5cf84b9b8c8477960021d1a9cf69d6b37cde7eb55b83c0913a7be2292a87ff9cfa5270d30b5fda9f0f2c2c4671a30c40bcb5fb1c61dd9a7d3f7af4803d1549210ea4374a758337010687d0ad17d89c250878c5761eecfa41889501aab3e197af77cd40fed1dfa1da0b0d795a086f855363f3acf419e8b53a832fd408ecc9ed4dc6ac43d5148e028406ba5619237f003828746d8c858e3c6826db3e3692bfd4e74de6d80ee72dc9dd0aaf7c58205f76d137967d68df254a5154bc6a27917f931fd9a218f1aae68acb00d3d75bc8675f0a8db938d097adb0c8f3c87f8b6e86ad0ea8f50d8f42dfabf803ba8adf2315c89a2a9590257b55a20242994057c30d382a9d95632a79d2858a0336c14289a7368e1ebb877e50520699ade10ac83d55c0e5170601d5518e404106f5a85667d3f57e8cbf8adbf83c800fb10895b58be3e65cbe51da1062c505b90b325d5d29ad98f4b5e8ff5654805a08fd661d4337aa32da5ca604f7611909130bed31de0300a06b352d3154b26bbe5ed4ab5485f9f8be8b9e0412a14c26444b0931e45df217882a206816fe597f7cd0713366ad5aaaab251fd075d5c11d131104e7dc189557a8b9775db12611d1d4d242cb6609b469f65843c41cc40f2167a204264d0431c5cbc06cd903531fcbd06c12f8672848517592a341ddd86730952a00ab3c321c41cfc3039f0a50bb4566547bbb22ce299d41710172e126646103ea095cb2eb968f6db47729c2e28d0df55f3d1deabdb21fd1f4e6fda19bc9faee8506330ecc5fa9831c9c169b294b84765fce985b8f52a663b63b87e3ba15b2d9410c5adab395815563eae57ba15453708ca0dfd6948bc1c95386d1f79b4b7b33b20f5a210f3a6ec1e1652be07b0cf1b7afc2e39bb7c4ebd72da0346f6bb907a9bf0cd953e605cffa3cdd626585d672ed99cef6df9d3e1f8134b9492bd6288027e6016b75bb1b3c9de64464f76f6640bd23654459dd1f24c828f46cdd8528ba1ed20098e43739087d61f81d9d9a91c38f6d66818334cf180663ff9a8c9013f251f3074ca4528c2d66f3dd55eede72e69ba112714ef0543845b846a2e8d6a72e97fc02e1b8fcd7e00b52107851d110a5b639d516a6d6e032435866d8301592300e9f0da385ef70472f770374667060055b003a7a516cb6a6289b8f2bdef5da62befc041d2a97a4bdc7a72746728a832174a8c15e9cd5e38b17daaa5f81281a5cf6470a5679d461dec70470f31d951dd339f5825c2e26a73f7b24a648f1c2e96f36770826975acca2cf0bb8c5edcc192949fd29d02561c19580e8e274240b0d6ae1750264083f7ee10ba3d69c0f2c8594646b3ba7cac9ed2193affb434dac0971294d00554fb45e8221bb7f21c435fdab9705d09e3503dd56743863467bb422463ead0fa73e2639a8ae37781c5967ab3d9c6d92a16a704b35d633250b91756aa6fca60ec61441469c09c0a2a44566c7c6f257d68680bb7e992d9a2aa9ce0275ce2c41058989f665a15d09c5a3542e9c3317bb8d6d1b87f1502d71c09ab1a242dd15ad08306fc6a6f4178285b44e900466fd94466e9ee41148f6c2a51fdace980517c60da2d7f22a8215b1e467d69ef8d2f1529b6222b14a219b83d5a7302df9b22cf10b920d7e1ba516bb6ace0053ff2a6cd2c08ddad1d2576a8d0699f49fe3755b3008b93cfb61872dfe917ae43352769b2bb19438006909b11fc50324406388fc8105dec0212e0cf996090456da1bada9d2aed0d76cd12bf0779efc89eab95cbeef02e0537a6ede64ad90d677c1f1a524531fba325ce049d1bd91acfd01458ac0ae0054128aca5bd84e8fece89556db0166dd8d55e7f52660c2f1179d490847737703de3701f612092aead8d07d5d54813ce2ffc8296940a042646ba7b812c2f44204b48ef1c713930cb0fae4aa01354c09e2979ed61f439139ac40876c3b9259220e48c54d23e699f38bf82d7e58ecc4f36f684bbdd3f3151bfc8e3138384c16970e446b815a8d40cfb3ea8373758baef4d8040b76b689838b585dac300e205a590eeb795c255dd566cce6b886ec2836eadde71da600e69f7c4595c48993c594ec05334d5f2b45dfd75b064ea4c74961b07b0db9a8fd9b104ca6d1f7e866853b7d0d2ad462e6d884f78d9fbd76c7b9a7ea3717f98c24759e22fa755fbca1fa62f400cfdaf5afcc945b9e3c6a50b5532cd5ca89361bb3550f6ca27481aee23d65930a94729eadcc4b03ff57ba9e996e60d1bc4139e784dbbe3e885d7df4ceed2ab50f51340adf42372dbb7eb372b6d8a30e5266b0d22abb38fa6203082980a7791b0eeb3bc71cdfe21e2f1b4fa1010095d87a85c59e087bb5af9d401ce9614fec7503a4863ac0a15798624c81c0e705adbd315df4a44f46557b63ad4e2e0710178400ddcb10bb9f32a649601ead4216d8dc3674f56c48340f7fb38a794e9652e48a04929ada41520be2395c11939641222a51bf873d580590bca45b23bb3e09ca4100d9a90eb38c8c5344e41b42ca0ab22698e355fbdfb052dc5fad75d0b0ed5ddc0e028ab8a6176f24ec70ba64fdf3f5b0f8f93f6f5ebc77ce2d6fe023787736a90ca43757bce96fd6dfb496e8aa288ae809be06000f3504f229104584ebc8604e0804af9abc70c4030b001bca9d234fdb477a7665e4304f34d4250ac3dbdf193a02e25ed377f485900e625661f107d81225c22a13b0d646ff34f700ee249606c30679fbda4e7d55d571a00963ae3ad37cc9dd558bff76287911aab377463140db07f24bdc80052076c6e6129c4663f3ae246a94c703a1b113043debde5adbe026019d46b34f138208c48473a1ee866ec984000d1f4a53aaae879c2cc6a9b9cbaf0902302d4ace36e194806b9c580109a481fc00b50f889e3ce0e68a3842a8db250b8cded23ff229bcba71bd07df899a6026aca13a610652d4eefb36425d314e060c5fbd30a988b573c034cdbdba0bbaba2d7130c594d44d15346134d13aa0d4230e395c3a56ff8c9e47465cc4e54c840b66002fa266f1865d92abf7d178d89682084bfd42df6aefd3235a99eef91c337e8a62c97ee7d31ca2fff2822149d5ea49074fd542601a864d21ed48a0f6cd7dc98e6d99d234607f9ba8d684c9afc506a306e7e1a54d1f37b498e79e490467f0b6677edf9eaec9d5575fdd40e4443c6be80f69b8d1d17f3eee073c19dfedff5d37be7d844d90f9fc6d14cc4772dd1b70ab09c937e3724affbf417ebb91bd6f8b1b7c2cb23e7b0305242957624fdbf6fafd0d1bdc8968f8d13dd4b4c1ee2ef8c3d7723aa6a202067f9a320743221cce2bdf0de49c3836c56705a15b6c4508641c939d7be9e8644ba750be2a5269b9739bfe052c44985b2eb1ec090bc417b0f33bde27965ffec4bf47199c1bd94e4833c21d068eb6d0cc045c5a8201abe216a295c88606c6d4b51a66294f7b1467a7136f0804c991a00927cc588a5d3516f33567e28f8d9a3f9c9c6ba009bf3d57771401a4007e4046352b8998790bdfc4b9b6a6a1385ff1259342974de051c07e1b91337b0b642580bb7866fad9e35fc5287b9722d64f2ffe6db1abea9bb3b7005d9103eb00e01d64b9a5e2aa79aa918e4453092b568e1af859e9defc15fd5c65ee0a6291069e8d03755b993b11805179f1000b2d0080f65fc163681f79eaf7f4ea1c619b0b2a79da5cef0f9b8de940a3a4ceec644e42067911d157ad47c6a93b7659a088049d7e760f22482733641fa84e92c679043343d1b8c6155b70648967c8b7a5b80a3e6ebfe817d8844f67d230a8b775462d8bdff3a3d081790a620acf2f0db1a20fab29f8a382c9e8559f5074008e60c93210e43a30f9b60b45ce48c300b87ce7042b4690e4fcfe584d66493a8c9656428d9554472af794e074fee81b4c8243800bcc53ea8b6109414918a7db0dd1d1fb801f735e0702192c3dec5c51ce0f13dc0682a5eb80a2c10d953d79e77fde5bc0fd6252377009c50e76e3166179e2b6f4069b6853f365590008f29ed1cfdd0542394151cb9f6385837681176f94f9461d0055f08dc07c23339262c1bcaa1eb72c6e2c3f5bf8415505ef002306a87ae0f40ead3cffd6a4354a09350ab539797394c83b62d90b9224fa2efa93ad4f206f5a0b74270efe8ca681a25a6df0812a434b5b0fb51cd696241fb040c4ab1d298f0101efb515ec727a3d01d1a3417ed7a97949eed9e2e6001a8b2588ea4b165798ce01b44d190c5c0f973902c0de06034014f394bd2250045c62c1e68a2900181034039966df6d513e23b43d29f7a7599c9f31afec7a9ed9869fa50ef26d01101d470e0826d37ab0d1f9752525b9b6ae5c380ac49a6416be19b8bc0f773fe2dd6bce09cd774a4cd27f88be499f440b3c8f89b5a4f95b947df08c464f10034fddd2010fcc03d254e508a992c0d0e56d3c6dcd430cf5c54ab26927bf4dae152bbc9c5c03882a33153501b8483c9febb01e7367452d1b27bb55dade148bec4b80fb70b506b1d16609872958fe5cad40539bfd2a46257ab455f1ef0a1ac0cc88ed9bfcd2072daf4b0fafec4a83849992b7aa72a338704951da7180546c967559f264e0bc0aa5f0d61ba0d1a31c4b4e04f286a4b450aa74cb251b5e914f2560c197f1ca200e6087dfd13ff88d84448d9a14d8198cd01725ab41d5c2f7640a5143e1a7e8f90df96fb2ad68d9e5b958f838503b9d95a21a8fd5c68e4e2f2b9365029ef079310792f5e57daf0c0e90adf0889e2c548b347e79521bac0d8d052586e712b226f8095cfc2e351ab6a9415be244ecdf4f929d12a6e307ae3c0635a9b8e79900ba0d0476d49f83e562e438e57677db7d4ffb2715a3451b191a6ef1a22e2363260a4f00c23f6d9a324505ada8106256f383159e042fb04a2630ce98913d59fcda98f90e78df6c1c9d8dc430f26a562969d9be60cd7bddc19b53cd29499c6616fffaff094dd2874ee03ce4da40361b05e574b448a14a74c7420e427d9de0210d2c6aec09a514e8160c3544780b518fffa70247564dbd06ad9bfdeb06a446aa4f116e9b0c33eb5f3da84cadf8dd1b1fb5eda4768a7f4373e56674ef310aab5b7d3f10740cf248a5d474961ab2d0cdeb005141c2680edc06364c0a35ad6836d932ff7a020c4baf4043a9afd5c84cba90dd3f38b86f8c20faee667ce30d4817cdb0007f2302de60e54da6e2aea6d142baeafbd1382a680621764598988fde58fb045826c909bee29fa94195c1eb6b1be1ae58648f1b5a7245880b7e3aaf460f6702a5fd5b0bcc92f7a141cd5efdeafe710bdeaf3b30fc95c037fb51131c401d4f89cf5aed0fc2c4174e0fdbe444ea81912d8032c30277a94fab5972d758613ae112eba3bf0e529593afb8bfaab09003baf2802427e8ab69fe7c7aefe125cdc7c09d379a9507b0021b68763d32095c553815099ebe1c653b990dd688cb3f3e939c599ebc3200dc4171620d9ffdc138af0daa899ac2d46c0461bba4dc00d97916c0131d54a007f718098dc9382ce2e9467aac5c456286feb5d95c452dcd3a1e857f955bcdab08d53889911481e4c094505faf2f2a6684e7363b5c0c571fbe81cf02f2b834a30edaade2914e85a2aaf4896efab596a6bb5512053e7d67f31629444658d65aca0cc957de3190282a70e61976c8b0903bd3714e827b750d30da1a7b73e7553d740f6c8310f40108d8d2bd3e88664efbad4cbfe3101f510cae4c9b4e72b508004a02c94c3accd9c1c7a5dc2187725781f4967052b98afcefe218c01f2832deee2f0ea42c8c6d82a68f8cb15266f6fec753312b7356260ae0f6e98af921b9600931a6cddd8fb88b634e018011e606747ea0f2333a02c8287a6328201bfb0ffda85f6b48afda20d7d1f97bd91e48a2cdba0467aeac1a2723e84441e0c1da8006e0127f242252864e23d05a0a71fc68d79729131e61d893e5e2593a1c9dc223cdfa3d80fb2bbb4765487a63b4ccc0951a8676da91b7677b3291dd68e1bc18897defa77c70f1de1a9a3a4e91c57b3257469d19ffaeb1ad39c55ef8e3c55b3eeee0ab1ecf91cf47ea42d9c95912e56e8a4125128b76b6383a5b47b5bb3872d7fe875bc549957901c4a31173ac12911a36ee05211d570e500cbeabbcae6fd65205914fa9b2d122030343567e0193b68b3b7ae2b30d300b50b5245502e80068b45155f979ebb42f5b4f41a04e82d1da12e7bec05d8bbd9e09ae4af83ff4bd626303b5263816a8fdd5e38cf5289cb7fd9a477fdc3e4201328b5e1856746f956eb34c1ad5fc0ed79033e3291bbb59de39e1802e7d508e064f31190d2f066bdf0fc78fbbb9137eca243b430de0327aa090883b0b5e29875e460a72d42523f850180848db977f9ea3b0e3451272f4dbe07e2d96238ddbfb5938e18651e9b44df458a70f85d411d4241ba6601d0538991c374ee2929051dc665a9073c819ab72651c6acc305399fd611efe2d85514ef90461067bcfe8b124ca27d1cec884e0e48b18196bf11b8cd6a000a64650e3d344adae30780fa2ba183f8c54bc39f6092d1544281e1fe23395fd3a6f62744d29368b9250abe7c1ede9d2760efe5e44225cbe9b85cd1f6280ba1bb97602e1a04e0d3a932f7af4d10152bc7ec3cef2ad94fa9bef19fae57347cfb310a8c1e85d62bead54f0b49a624ff62abd6d103089ef4de99a3d3d3d72ec2ba75a42a9ed558a155d16da644069f0928a0f241283939e7544f16234ab011f37b710752c56e26f3ad4858d81c1b8d5e970337cbf4d81fdb1b246038b728904b2110998c45cbcd9455fa6a4e7573fc4b2bb3a5c2aee9d929e05ca9da83ff2d6132f4e12bcb16126b685924c08603074667b19f560cfc048a31cf2a132f25f7bd73868626aba139f65aa6d34df526e09950e74c64c4eadb721f669c71f6695098adcc0c4cb09f1b83e0cc119617e255aff2708f7a12834dcc226ef02c5e8acb75f26883116bbde57f72ca9ccd9de713059675d70e7165afff812a544702c8a6ba0b542c64243831be9509672ad11646725c48076d9617cff22f6e2a6a2d5e20d712535cf218ff5ff193b814321e9e523ede2217f51144b74ca544ecac4b4248b9efe59b14eb5ea8971e1fa162981e12c16464d3bdb882ea9b2d2302369e477c82b3a947c0d3ae4092c90b06a17a5fddbe8bb6a8564f0d708725b4b1eb359c7236f25919caa94ce2b4928172459f24c1c9233917d7af08f2a0acd093315adbc5d1fe700fc4b675f073c93b0ee85fc8eb1866d4521ffafc3a3d32ea24e7d7d8d7b0a23d807a2876d9f12ee116acbd81af860b38d56a38a5be3b1e8548902f60e7cc644fcda6d9b3458dd24693193576a08a5b0e11fa98f2ce06293218702b802009c687bc67cff9981378e108e6a57815f0dceba0b38345b8be76a86793d4629675ba37c2c4b1d38c2bbc7dcef1310bc1ac38244e5150b94d78e64867d272c26ae602b742ccc4e0c76898d31d479cdef75fe271d8a068a36235ebef30c3ff0333ba7fbfbfba056d183978c670cd4aa36ff331a54c41b31b864e6ab91c90f3e891307f153b847cdd6dc5b7c1e14dc43e93a810a3e72d4298f01e91928b5a555bfb6150fe0562f955471495e1f88ec80df5ded907cce2850a8a7ec1f39888aeb17f36ed70bb1098572432754e7c3f50879cb93d1e92637f6c7bed04c249afbbf8b71b881c5fc313b255e23ba1acb2cb7fe79f55cd5d883d0fe9b492359e1ced27063b3408b17531d4413123adfecb0daa865502f63f94fc8e1ffc9820052dfade88b98db873ce96e8f4a24b3ee66ff9b6ad6a326e22630120a353521af69cef1c0153125f94be13913548114f31601004c4ccf6884ae158e521f844bcde7626b6f8c72a7e6ff689c001e148e0f8887132a33c1a6798438f682ee03f5ae1c16d5561cf5761d1067fdf8efc13d13df8885fac96ea5032f21f1c34c629dddc4fdd687c438c1cd1b8090e359af75c9f48aacd55467c9cd4bec29776fd3df67d75fae97382355ef45c185a5809622e184e42f91239b76b4d16d1585214f2c139b19b4ab466ab12e4229fab40fe72b90456eba8cb5e4848a2363afc392940163359076f7f84376e03ef6f0820a5ad5d1ee643660cf8f593fad0962571776939b87a4b49b1c27d3d3f1384e4410931b9831328c51233cf8e65fc41a629662ed5d491d6d7f524c8085ec18b6042ffdeceaea78b2d465c42dac88916438033fbea854776e11a9d8f7e7d82117faf256263f1babeb40be9738a0259d549fa677a4e11742b0290efe4e9ef9fd7c107cb585ca6cfa7e116e472e8a7fa6d047c337df487dda36880e47be8229b543ad67f5220f57012d5182737d8790b249a6aa9f3f0a1f43478d637fe066a0b96d5e1532b12bf294e3f5a1b40780ff7c03396badb40cc716f04e35088ad357696259cf8b1209ae5e188777bbf90fadc1d7b42efe7acd251a6b9181e22ff9c7c00d741e6224f38826958ef2c7ba1190a1dbd93d78d72ae138c0fb479ad6d48bb6f077736c3edf69a48d17599d2f99ca34d88abc3e72272b40bab8a57212e6ae2713aeeb006fcd1a7d044acf68ffd2cdf0d23473308673c3aaa7bd599204177392eeac3c4c25cb2adf555b5ee2c5aa9b2f71b8129e8dd80921230dbe3460a79dc11f41d9596700bb04aeec684f3f0333b6e4ddd50f8771b7b1f836a838b262c1278528b42001e4f9b8cc75de8a9f10b7705a1ab8241d193771b056930edb2173abde92432a8f31654083801c495c24b546161cdfb6bdae50cb47c7fd08eed3a260620c734e91f9266777116a5ee94438af3b312a770c6e47121f5fc30570f8e8234dd91f75d15b3fefadfbe47f8aaa3c61da86b0f3ebb65a33e9422f079759483ca56d045d521995d905e130cf1dfe424b6ed19f82e7d356b673cafc0876af7e874341f0f75db71e5c594d123872f2506267ac148dff3fcc73ab6ca60da8d27323433cbaf0f0227fed5542f39ca4e535532e36e96cfd2b7a3f7f6d6c045c9984f4ffbb8725233060d5c10f3940353116a3bcaf63782bbfa4ae52ba1f0165b950c505cf96b89d8c64167a93ece1ad44906f6f09fb052b09a7b9bd85890ab60405a9b9390a3f199326f81891fa42f9ae30d9378264c805d09be4aa7ca90338f2bf5703c5109fe17720dc87e389c930c187f0db83f9d67773c017a8848f07905bc5eaad4f024a772a37d86808cf700b95b4e67dff2f9df80cae43d1b74a0d32c0d8fd18a0835b9607e68669c8feee9a6ca72cec21296e73042f76dbda6908b5d6321e80cd651d69559676aaa0a8c1caa768911411a3f4e830d8dbc3ddc1047027b31e7b5e983b79753e068cf154ee638a3079052f483b55672c7459654409"}'

Output:

{
  "status": "success"
}

import_wallet_request

Request to import wallet using entire blockchain history. This can be associated with fee to be paid for this service or can be free.

curl  -w "\n" -X POST http://127.0.0.1:1984/import_wallet_request -d '{"address":"57GLuXxxxAqdm5wT9sFJ4aDQGo2NkanFJXmDoZZbBeUFZ5b7QQ7pJvYjfkvBe9PsiZ4mGY9h7s2uxEiqS945eR6RL2yWikX", "view_key":"5e05a2aae20eafd68443e4d972ea8400cb7309ed85d339104f9f21542e45c403"'}

Output when fee is zero

{
  "error": "",
  "import_fee": 0,
  "new_request": true,
  "request_fulfilled": true,
  "status": "Import will start shortly"
}

Output when fee is not zero:

{
  "error": "",
  "import_fee": 100000000000,
  "new_request": true,
  "payment_address": "5DUWE29P72Eb8inMa41HuNJG4tj9CcaNKGr6EVSbvhWGJdpDQCiNNYBUNF1oDb8BczU5aD68d3HNKXaEsPq8cvbQLGMBjwL4UQtQYJXrbu",
  "payment_id": "2cf6fef372541dd0",
  "request_fulfilled": false,
  "status": "Payment not yet received"
}

import_recent_wallet_request

Free import of wallet based on recent blockchain history (e.g., last 10000 blocks)

curl  -w "\n" -X POST http://127.0.0.1:1984/import_recent_wallet_request -d '{"address":"55rDoHrJrwMUcdbaLYJk571vLAC5eZ8MaCtuDjcsFV2DTwr7R527qS3X8DxuTPsFacMfj3ESNJ9yybvzQjqSHLqsRShPQnJ", "view_key":"3bcf20ea17f8d1198b731bfaa66f7350e4c632a57289d47544ab5d8be43d940a", "no_blocks_to_import":"10000"'}

Example output:

{
  "request_fulfilled": true,
  "status": "Updating account with for importing recent txs successeful."
}

Other examples

Other examples can be found on github. Please know that some of the examples/repositories are not finished and may not work as intended.

How can you help?

Constructive criticism, code and website edits are always good. They can be made through github.

openmonero's People

Contributors

dternyak avatar eyalfishler avatar j-berman avatar jaqueeee avatar kenshi84 avatar moneroexamples avatar stoffu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

openmonero's Issues

MySQL server has gone away

Mysql is dead after a while. Maybe timeing out?

# ERR: SQLException in /home/mwo/openmonero/src/MySqlAccounts.cpp(select) on line 680                                     │2017-03-08 15:17:12.899 [P2P0]  INFO    global  src/cryptonote_protocol/cryptonote_protocol_handler.inl:1090  SYNCHRONIZ
# ERR: MySQL server has gone away                                                                                         │ED OK
# ERR: SQLException in /home/mwo/openmonero/src/MySqlAccounts.cpp(insert) on line 752                                     │2017-03-08 21:14:46.504 [P2P8]  INFO    global  src/cryptonote_core/blockchain.cpp:1420 ----- BLOCK ADDED AS ALTERNATIVE
# ERR: MySQL server has gone away                                                                                         │ ON HEIGHT 1261975
Error getting address:                                                                                                    │id:     <b04acb0d2921c20a838810bf9dc772d54f7eb695a22b2a81eb3d6759ac517010>
Cant parse string address:                                                                                                │PoW:    <5fff4abfb03cdb28ff92f32743c602af67e5839dd88a53749c100b6900000000>
Faild created a search thread 

Upgrade AngularJS

MyMonero and Open Monero currently use version 1.3. But current version is 1.6. So maybe can update it, if its not too much hassle.

One can get tx history of non his address

If you know someones address, yopu can just make curl query to backends api to get its transactions. Well that is not good.

To solve this, viewkey will be used. But we dont want to store in in mysql. Instead we can store a hash of the viewkey. Then any tx related api request will need to check if hash of viewkey provided matches to what we have in database for that address.

Incorrect datetime value: '1970-01-01 00:00:00' f

 - searching block  0 of hash 48ca7cd3c8de5b6a4d53d2861fbdaedca141553559f9be9520068053cda8430b 
# ERR: SQLException in /home/mwo/openmonero/src/MySqlAccounts.cpp(update) on line 1059
# ERR: Incorrect datetime value: '1970-01-01 00:00:00' for column 'scanned_block_timestamp' at row 1
mysqlpp::Exception in TxSearch: Incorrect datetime value: '1970-01-01 00:00:00' for column 'scanned_block_timestamp' at row 1 for 9wRgvRJMTLUHwK7YwDejmwRRz2CKZPK21JJpyL3NLi6hGnq9cBjmKbtHtwhCLPumcxHDTHz2khWUEMgei9QJTNt7Norb7rQ
[Thread 0x7ffdfd888700 (LWP 17841) exited]
Thread exisist, dont make new one

Incorrect values of funds (times 10)

The values that are showing up in the balance is 10x the correct amount.
I'm on the origin/sending_to_subaddress branch with latest monero.

The only thing that I can think about was that during the installation there were "narrowing" warnings from long long int to something smaller.

Ability to disable fees for personal use

I'm running my own instance of openmonero and this instance is locked by a HTTP login.
If I want to import all my transactions I've to pay a fee but it's a bit stupid to pay a fee to yourself so is it possible to introduce a way to disable the fee requirement for importing all transactions?

crash after TxSearch destroyed

Thread 3 "openmonero" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffe7bee3700 (LWP 28256)]
0x0000000000a9e13e in xmreg::TxSearch::still_searching() ()
(gdb) where
#0  0x0000000000a9e13e in xmreg::TxSearch::still_searching() ()
#1  0x0000000000a59d46 in xmreg::CurrentBlockchainStatus::clean_search_thread_map() ()
#2  0x0000000000a5757e in xmreg::CurrentBlockchainStatus::start_monitor_blockchain_thread()::{lambda()#1}::operator()() const ()
#3  0x0000000000a5bbe4 in void std::_Bind_simple<xmreg::CurrentBlockchainStatus::start_monitor_blockchain_thread()::{lambda()#1} ()>::_M_invoke<>(std::_Index_tuple<>) ()
#4  0x0000000000a5bb3a in std::_Bind_simple<xmreg::CurrentBlockchainStatus::start_monitor_blockchain_thread()::{lambda()#1} ()>::operator()() ()
#5  0x0000000000a5baca in std::thread::_Impl<std::_Bind_simple<xmreg::CurrentBlockchainStatus::start_monitor_blockchain_thread()::{lambda()#1} ()> >::_M_run()
    ()
#6  0x00007ffff572fc80 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00007ffff65376ba in start_thread (arg=0x7ffe7bee3700)
    at pthread_create.c:333
#8  0x00007ffff53b482d in clone ()

Server Configuration

I've manage to deploy locally. but I have problem putting it online. Getting HTTP ERROR 501. I suspect the Lighttpd config. By the way I'm deploying on Ubuntu 16 server.

wrong result from get_address_txs?

Since I can't get my own server running (#31) I'm using your testnet server (http://139.162.32.245:81) currently. Is it running master or something else? I'm suspecting that get_address_txs is giving me weird results. On #/transactions I'm only seeing incoming tx's. I can dig deeper into it if you don't already know what's causing it.

[feature request] Import inputs/outputs

Hi. I'm currently working on light wallet support in official cli and gui wallets.

When switching between different openmonero/mymonero instances you need to do a full rescan (which sometimes requires a fee). Would it be possible to add an import endpoint to api?

This would make it easier to switch between full and light wallet mode. Let's say you have a full wallet on your desktop that you would like to convert to a light wallet that runs on your phone.

Something unexpected occurred when submitting your transaction: invalid input

Getting this error sometimes now when trying to send tx. Dont know why yet. Maybe something to do with the fact that we are at v7?

Example raw tx:

020005020005f6d907f29705e1ad069e8402f90680275830fc446d21474d35e3c0b4af4cd1653297cdd59dfbe04a880e47ade66a020005d3bf0bf18c03d76df361e58805dc855e964f1a9d205583f7d5146e15c7a163b5ffe12a5e98920df1a39b82d123020005d2ba07f3d307d1e702f91c8e94035b350862eb3df1b528391f15476e8801a5a4401255673a59d9a735f52b92a444020005a1f50997d001dbe7078405e3f5011cd151bbd878c63a2002a5fae06e536820d85403de37947415e0816b1ceaba32020005b2a4049f9402a3d206e5538acc0778de27d3ce4e2b5e82d71dfe07bf3c18b9df6cfc041d1254c98c02c4f1380d9d0200026dc909632ff8d269206c1e89f08eb4d265860c733372b97215a5f628d7c9fd680002aa255ef3b0b7594a128ba7f6bd6d14517c2ff9cc42749cd28c43950646b92395210144244fbea8b91b09fe74781e12d7f45dd6aa38653d4ba7d6eed5410dc68fd6b302c0e784a44af26316c75fbdd318bba56fb07d7045a69509522b59e9dde6a255adb87a74526bf11cad2c0e21fccdfd7949efe5f36240f01769eaf57f9f820891c5d5ca327d7cf4b16faed7c9f80cb3c72ea5ab6e52b6268982ea33ea663ae594d00a3e3b1a34fcbca6764abe049e58a050646cdf33f53ce394c0ad372e75ab24c2a1778ea219ea19cd83e65a628e704bc5d7aa1665de7efa9486098f7eb92b2e00f15ee106c7f9303f7379afc65f466cbaf3235412d15635e96dd0f5573902753a17ec918105c657ebc6ba1ef3537e2f4f243db1a8434c81ed8555cfe9588c8d2690962a2c00843bb7568db1a7d5318f4957eb2e7ea04e0a0b4a843396f463a935446acb5a0d0a164d237c7b1b886f365eae32a5169d1db2b932f0e9fbcd3fc35e04b3fe950a8b033d36ad0052609b3fc5fc9c37867cd9e76580b2b2977a1c871eea31bcb4fb77e67cf7931804c72f0e55c75730e3dfceb6de5c5f055d678da08adb0c47716e01816fc19a85bbc6f7e7fc7e668da0b47c545f6727b0b3697d4472032f9a900cafdafbd82d3d3314c5c968e3efaaa358c166e90e2608bf5764712ed860ee0b0d5731f9288e1e8aa1d5c3116be5da16ae7fc72d88ca01430407d05ed684e96e0f5117d72d09ab0580b34f16ef3945541cb7e9c9ddf5cb20e02418f7a8e56e790c70f3e41132641a4c0ec1c80c9c6bd84bc775b92694fbdafb907804e323898f0e50db1a76bf28c8867784e9b069c8406cd58693e094915a9b5ed2fc3b0aecf80fb049d8c88df2f84329eecbc64a51dc8fd6851feefe7184a595ec7df2803b1b054cf43a02c5f3529b1d7858c327d5ad8e229418428989f75c88c638e343799c077a657c4cfed91eb3451056b6f57b33f03c808a6a7d5ef6c9acf741f121b03802c933c12617931c151043e5478b16e490af2f0ba66e6c67a159ec51fa236a51046218d06253b645ba35de5afdfd5159dcd72a32587bb8ae2f872d1b459045fc02c0b603041a275c630085ddc4b9b6dde6267f8ac3d7219f203432e27a06a2bd036d5e84927e7fe2dce9f6b70b812d7e7381fce5f012dfbf4e6bd563f1023dfe0e1c3d2816a5b90599be22e269d1de13873d5513af84994033641665e786342a04d3a540a0302882e598f1abc83e8efe1f3ce829270a017a3572ca829c8d10880bce0e4ebf207d1bf79f8aa22a4065ec7f37b5990d3880d8d2d10de27ecce52007407207a4b828f2f25928c14f27bfdc9cec9bddf2beab8d41c4610a447f762f06f26800bd8111672ceba5d18dfa9517a24fc94494817ed27482951ad26f86850374da546ca031d7822bf9fafc30553364d09f9da424098e8968e78504fdfae3039ab50e9da783baf148f37afabdbf9d9f27b30003394077e01c01506ab624ae0ae622ba522188aa4e745ac77cfa91eff843fa3d241fe31c012f0f4196bf7fa309d08cf7b8830692b69a2c4e07b77621981d71823e22fd6abae471d2690a8e9a00789376091d2f61013bcb89c91e730cc7471d3280a565f256ce1666dc82540002256bf61f3db811d218e987fb742acb0d8f0dcb71722ecc263e4c8c4c5bb74c07a66b743431c939af4400139ebd53e6a97cb5bde9aff6aeb5988dda2125286f0d9acf98dd533a46b67f8d303a12fd90f2ad65c5a75523b3f86a23480b4e27e401b7b84542bc1acda34eaf655a7698e51765d1c175be6cb441f1c51cc09f6cc404ba101e830a36b0112cf9d958ed83b3f4c9379a392e6a94d9a5395e68c2ca40010bd82f73698da4f7abc9c4a5e49280a1459d0bf9477e496e857fd36cf08d6b05effc923a96ad76d1508c58d2b30c7040ada289e6837a2c31ee825bc8c2157d00d2ef5f79b13f8b61dc5149b993f9cc24c30966d1cda87da9bba1bd7f4f8e7f0095f823767ba79fab9b2883705cff150498563f36a69a41b8f1b2ccc0e504f60ee3ccb04f5e8fb33380f7eb0f27a622922c113e9a6cd947828dfa51e94508d80eedd1f52f6fe5bb73e598ab5e4fa7a1d747710683272c9bb6bbd40cfbaedd8105c9b2ede71ac64e7cb4293296a4cae5866fa8ec5661469c54f2c8ac00ba0a2b0ca07bcf030c3f0b3e57465fa70e82211c76051958a9ee6b926c512cc564c43e067319cd8d00ea4ec4aadd16612e4a666deb30a22bec57327cc49556de6fdb8e0de7f53a412a42864cf9684dcf48480c1f1a1aa17292287243d61a0110b595990017b96fea73bcf21576701616925a0fbc643db54c2b42be58df7fdc1f141d0e0ec65461c28902273bea620a5af0b3ceba4af91849fd8c85fb10ecc20aacab8300b40cab4df7532e2778d926e1baf860a7a094003e3159061d45e40ef088e66108553635f0ed56b51b709a2a0ef5257f7aae5f1dc5f7a83ce9276f1819df7549097c22beaacfdcec24dfe3b268b2d5696e3f001ea8693a6f631b11ca5a25ff9c0cf63d15809a49e23fe9d8229b1f17f00a0de24190c118122633ac566827043109353d91c17b230525ddf3829f05df189bd0e2438b40f22c007ccbd5f326cf2b029fa50716688e1c00232c74792b6e50efde38008bddab2361addac6933cffd40971965495a86937f6bd2a2f840f2a9726da414d6cffc0de20525770558c9336069d48bba063df8af360d6332d49a9349be258947526b5ebf4aaec73f512c70907180880264cc46f2f47039fb83b4da500847c2d576b637f4b11c6a2dc24298f09c1a72acaec60bb55cb41d8d8b0935e383d2cee52b32ce370e6850dde1b8b420033749b56c8a8a34735cf1255ed8b2ef17993c38674019a2d6299727ffb77850a86cfd405adc3b53155d8ce8b7941521f92f5581dd7e9df759f4da5cbcf341f01cfdc77e4c94cc83dd191f4664589f00bcae1a1da99080e267eed0099a07d2b0ad5a8ae9c918ac59ec61824edde471ff6801c48dbf111b8bea5be391dcf11cd0d68b369a98e55ef380801c4914cbd6bf13a4d90be3d558b29af8cac1cd2fc16058b0191d3cbe927e5a44bbb478f56fcf69f7b5d8079c2daea6ab3ca387bebd403f921275a6efe2ad0436e709ad3cd09d226e395a512a11cd20bfeba43bdc7a0060c0bd2a0e8489b6a6dfd5f666b8c0d6f22c3b03c9ccda1659abe7cba56d9490180dbd1e4414e8d18abd68b4e082ea3e90f9e649e9d702fbb0f0ca7db8a5e710d3cd96a4f12c25d585b6e467f512b52247099d73d0088d7c448ba2e5a22835a0ee0984f3999a7ce66ec86f7923924317b7a044f524ebb43c3b8d613888c6b2d0e16d43db0808325cfcc4143b5a4022c1cccb885c5ff5209b277e78777e6b0530bec77059ef8b93aa8b1e31f9aaa3a09d0e1f680b93d700f561b81ff9bf8e6d50c79b891c13feace9d27d2f260d05a8aea4dcd7b9cb079262be2a0f35fa11d2c01b33cfc4e7bda2dbf883bea5b33d72459ec58c69567a7efa00c7137c76076520002bcb6a882bc3c57a68064b22124b49aa4dc405cf5a49eecbe6daf90426fdb081caab5f910bfa39c7de29877bc41cf827dc89a87eafe9c9175f0a26d79059a044d87db8e7785617036baea22b87919b141638882278cd22651f447c28cee0e03a474c15de6547a15bbc6fadf17fcf5c40b79e40322309830f995d5c923c8eb0855a906446cb2fde2eab11c03adcf0be7aceb15c81a032f22c82d9d372b4a54061ad9554e627ff1ae9433387b9ac137278cbde5b21dbc59362c3f738aa63b8c09f8f321dbdc1c94ea7e40ba12e8cc53ee8515ab9c6ef2c5092104151efe2dfb03c63b770b9b428b6bf8d650a6e9e829ac22bcac428de493162feb2a48e882500fe3371fbc77c492ab995cfd5ac7cd33105846a4e11acfd33ca45e74c6791a2e0d8979ca1799867879e7ed0c62db5aa9751b7a67c1f05d94a101ed207f99d83a07188a4184e53fa4f7803ec5699e077fe93f58505de33e22ae58bec0066aedf803019b556db89a0aff438da43a990ebdfc51fe48fea6cad523edcc22e9aa7c6408efbfae7eba050def3bf6472a8eec990af4d1397f51c2652827558e324d845d033ee25fa01cbbd70e5b961e78184de86c1cd7f42535ba3d1527f957472882f601c6f05be5248e92f7f406d0d3baac6ac6f72ed8fc505a645a8ffbe2ad84ce5307b25e73d18c4bb604265f072542ac61a5bfe0933de8f19e0f0b5c79b22f68e608ad4eea4ead3c3489a171f1a35058c22ff28901fef503aab4a602c21d1db19d0f8728f5ecbd36a74417a2c15b262dd7c4bae9bbc3244ae1151b3e359d72de300e315d328401e26a2abcdba0d70c6eecf2aa20dfeb201889ea1eb211bb471a7e0484d61fdcef861ea9b14f75b5ef7ff405add4be5fbf0241f5acc2d04f3fa58f00ce3d3a14c31c48294b37f1760ce9e99914cb7c1ca790a74a89a819332b74fb0aa2da9813761a2e67c4b0d527d4f76d32b716d690b85ea5bb2096f1f1693a6d0e2f68f1ba7627a5b9c7933dc742385eada9fd788afd2f969647d4a6a1f08341024ce062c6ef0b6c9eda18b23ec17786d86eae9176c1e3ebf68f0f3aec07334804ca1625aecde235ad24662293c31f2020c0af9529c6a044402e0ddc14d2432f05d6e17b26ef4c0ffe0e72c43784ac5bc30d5bbac8e852fb384417a9bdaa71de0920e292610937623d218be0599df2c7f670373d1eb0f609a00cd68778076b8b00bfc0deae808ca37ea882f5dce49af4e53aeaf0551ade5e4c7cfe37c6e45685059f2e110d0f476590a1b245689ae4ea8a66905a7f0ad693e3c955e5118722a80729d4d5e1ce6a94a09a596643e0d2c32339ac471c8d4ee27ff5e980ee741c990d417d258ae10f8da920bf1ff6f4b55426334ebd6cbe7098af434e2988459ef60361b9f3090e86e7c18340998b142c6c693c23425c162d75e2e168df4e3601100c9443bf6b407276832a9b42ed87ad3865a035c94959fda4d1ff59cce6150f400bb4d19040171408671534fa8124428ff58844429aab698f1c05d8b37dde2b050942d4217b364d8c35ace151550c159cb22d0884cfc9ed77f3559d81db04312a0633ae1c0eec9403a2aa9629ec63ac538a367636ed6bdb43d0a96e7910a697a40ee9b78f0ee9e3c62188d4867b396fb011233af5f9c5e049113268a55872f75b0951021fb92a76cf754904173b09affcd2b8f69ac50cc1c6f7b6a1a6f688a6110cf7c8c27396632a27421f1bfc300c3cc8495f189856c4abb713d1111fa62eb60480d0447f6cee6a88ddf5973ecae011bdbe72db1d3a5bf61abbf4e7195e86750c21fca8218eaaaa998668f52d2dabdee2d06700d3e31aafc614635a5e178f47014ebebb4f258c7d842ee1a1dec1c6589928d67f486f9c8f101672387c7e1b2206ef2e032fc08d9c29a2759bf67f5e7485944e5c01cc5f84cd1d825e2f761308035202ca03bd0c778d1ec9472218594ba0cef5442a8ff3ce582189c4f5fec9d90a49812e7b50ff7e53f2d89217e90d7921fe593caf44729437aaff09bb2291040ef3d6ee78c41d0774b40e815ed4852e34e6e328a4db67d4623ad247f4f940e4081351b8ee9a7243609c3ba1a4f15c974169cf88e99b0aca8378396b0613ca0901a7bfe2294c8dc018ff3db0f5509e75193ce71407674ae7d1dd819cee5f7f940ed9eea0e974735892af71bc5bf0b31af4f15a1e343c876cbcf2b8d915a62b560a499b84347a7ace0a95ebc94678d362d43bf627f1d15e3842b2ad82ff64d39801b27f3e6cafc9d97d1fb3ee1ef61cdd0495b74f0a62c7e0ed7fc2efc85629ca070b24b33a9a712b1ca50cbd84d9b39094c0a91ba168e66689f5a9b2303aa05906d9d5cc342024a234fbbe90d686e74f671d4318d63c355f71ee1512f649eebb03f8e7857ac7e62686df63a7934b2eeb583f2bd298f577328a143ba6ea2ae2c4006631f39f27b536ce1e09c049c79191e895caf327d7579c97caadabbf024dd605f450a89fa2b5bc4fccefd14fbdbff3d47e0fb6e646b1c666096e4cea161d2b0ac0d54cca4893142112e8c45a33f357aab62c8cc8206f2dd1ab369a1d2541be015a159d8e9172d71182089e173cc825c1b4c8853f0674d13113f42dd64aed100d949d7ffd882ce15a49c5af7da0ae190a15ca25d46d3c8ce3a28c638f7c0b740e7087bbadabedd1057ab0a42f453530afa501c351178e8e64578a35264ad4e40a4e2d49cc5d10acc14353c04eed68fa01e0ec0d35a123fca0e1142d8aa6086e014f9518855f627be28521f73a215240f032468a9952135b2a17a587df15ba4c0d13b0281c729af5ed9ac508e5ebb673a5753abad992719e36417e799630a87c0cc4a8b1522131ebf2be0c21ffa544ea64b335d06ab8e7fca43266786aa6e96d05b25560fe6faf163385f3f7205fd51cc0d015eb5c3dfe29e413ffe9a5f2e295b4a68096414538a9879774c29c029539d618d732bce0c0d5cefd21c386b83dc1a2870dfc744de85554a85f1058a2add6fa49cdf3f941ca95926523c391cc76da3cde7984ad30e7b688da6551e4c8dd6a5db636ea7062ec11786cbe0979a8c4ca3fbf327c569f20875bf5e96a269d61d3d1bab3030258f19ed3d28ef97d9adf5a26829cc2f753904c0eb14c00dae6606c574ae2dbdbd539a48513e5c4684565a9d6b45dde3f2bedf6c4f8718805e00a1b61dcc300175a194c8cea09faefca065b15f6b1906a1ada86342136eccf792f9173243262af628bf9e49823a4770c02aac4dc8fb425a3d44ebb473dcbc967530754abc2822986dcdb34793676d8f2ce960b42219bcb955a54fd355b26a7df8215b775e880e3c1f27e40b1062fbce9e3ffae533f9ec278d7e467e5f62134c5d53e7851ea8d21b593e1ba0914bb0e991cee510ea001c24812bc9e02d16cf97c8d77cc1149304c57472bdfdce46e63a421a2c11cfe8865b99dcc0380347aebb39620f6ebd6ac7175512302de4eabc3c7d13a84dd6c82c385ad11a6c019c25d14aa97d1079ed89e5e7eeaeecc6997217afc499552cdb5f16196eac59e55f4ebf433dd94ab52cbc24703f06c0126fb6a02cfd98e72d3e70396e6019fe90df2a0fb0c852673c3b500dddd14efc4df40c7373109ff5784e48f9ac3182c1da5198475f1bfd64ac6226720f71e5ebc9558b9bac907647f0c5bb082cb08a7414a9aa1f15e31f4e30096b0a92e73a6ab289164f0968ace3dbb552ccf1eaeaf1c5913fb94e3734806a0b22870358c2426143f1e43607ba07f70433672d9ed81aa98047d00685a21274193af8d119d180f857d79938876be9c1f2676e17b3f9037d5389f482eb1e18387f3c016d6a370db6c1b0cc51e935506fc63c3d1700f40c15d6df69de22bad2a0b4aa2e476256f7e51433b70e2ce2e5b62f4c67b3b64add99f92d75c202f79b9c79272b61f5f2b20743d55cd6d74cbd9f765a51d9eaa0d163c93b1ab96694bba4960b97a95666559c088715ba7199990e209dae83441ead57180f7139290de4135243e91071f5de85ea2e6d99eefff069df05d587fc4140c25992924ec09273752b622ebff84d1b2bb6497c1a569c22c7e158ca346047fdb3eb9adc8aa43d6f6064db41c1c739c03e7bb50ddd9c4536dd4b42bef8e7e48d6ed373f984a67b2a5a19fb97d44a3e509a63ee423fab3f0e522acc5d22314815681c10dba5fa6280ee4bcc659c8e0a4f7e2fff78356485a0a00c24048550897c25db3b19600e133f6fc3732097f048e7d76d249ba99f51508d711be28da68954e3dbc0c7b297c03e60d9733e3f59714e4a7bd91b4f899a1cfa54e2e92a11fa9eb2e1812a54f00426e3fdc0108e5e6236c62e5f4bf10e9ae20f012246a6abefae173936098610ecaf49573057f5f8b4d691b6f9e5f72633b932b7dc8f5802943cb7532b4ead6a3180aea41eaf1b2bd068a7469ecb8d91e056abd1e686a0353c803985f3f0e52532c997edb209400f03c5aebe368c33912ff9d681ffa96d69af7c508b4df04a37d23a4531c8088acc4581a56e89d0bb68c77197e10c94bf4505dd8b34f2cd37e9199f0c7ab23dfa3252a8e26bf7bb5de2c41a4a6131d7e74f03bc78dcaf1bfb9428464cc6646364000646e001c7b64ecdd564e397186127b004ec4f48a6f24623d49b854dd06cf6d7120511c041862e342dfc1ccfffa9a15f67283a2709dc7e3a0d554c72eb0ef6111b7c2c89b9db1e0a7bc5fc1da4d39e8671bf9a040f55474ef48f19ac23ee61e07ef6a1207b41343b7a391712d4d8e6a027bdac30176637e3d3cd61b0f008975d7563fda5031f607f9259d136e16d0f673b1ad460580078782ac61e3a21f16fa81c3e9751c3567b57947fa1672a115116f70df63725a1c3caa99fbd612ef3867f5c827539ef13bd20f9afb7bf0d8e0fd3d22f1ea3893eb1c2277ab05fed5a433166257848b9bbc1f60025cf9ec2744d6a454343b9b3c29115fdd64de5dfdea4f1b20b4f897806c5dc77533923681e8d323836a2d5c9c868752c4aab1130e1060da054863c7a8e469ff28b71e12c1175d886d367186e75012517f449da0c4ed7a32e015ba898eeba45a3d41e052411bae118c42bd0f6bfc2f15c8cbefba92979b839c0f4f4329fac625a43c481ed8379a1751b14fc34d5c51241a299118f9b1ccfd8a9bc19224353cbdcf619e9f615000e8e28a0f63e63e9fd8c08367d0b6d575130f7acd3485ee20b4e2e7cb1679810f14a4975f66274b4022ffa85468ab85b50a5fffdab8218705bc4e269afacc35e95e7f7e5d992191b31f2befa09f3bb3a7d419c023bb6728facde12f94f97ac411e39a676fcbe627c13a44e91ad5fa5551c214338c890dfd28b265001fcb9b412f34b8c8dbbc2b0e5f72d56e7d0e53e27113552ee24f06d2d3f679146b5d65a330f7b110d0c75ee74c4949bda5beef132fe2f5da3150ffd116f33373c9b976ef09cffe467f45a2cc423ffb559d86f982f15c47452a5c81165c16c6f58e120164c6f4ddd1faff66ee4df2a991094d88f977deac653607f300ea9817682c5e2bc2b5c845d2a80e0cc434d7eb84e9c32a97808ea98aa5d1f6a9901a1406f0e6e3aab4dfe4831af4067e3b5a30bdce2a53dfd83b7f396deba9071f4a836e5cf4a71f7a6a7690404144b8b48f11e63dac02168b4b413c1a7c7f0673a011b94f1b457f18dd86c0ad46192386357855d7416b597e806f7a91ac56233c7fb7ec653fa7a6df82934f9384a73fa2aa13c674c2b9a50cb37a3599bdc7ceff7cf8b64316ff96bd95872dae69bc29e5fbc609ccc9f46d02bfe893f0df50e749e5a443e4a97c64287964dcad93d64df6f079f3d9004d35881d812da21eb136ca1707c96b4fc3cd80992c6658e4445950a93d6205cc14ab12676b7b988a7226125a02de4a9c83a11408f3696442148c670d763ed82932e9e612192da96cb439a84e0ef0133fc99c6bf9aed3fc69954a3ca07e985669aa4f4cd3d7fcde6d1fedd55a059f0a7f0782baf29d7bf60e2dc625b91ea855b5bfd239dceecd4260436e822804a4dbfc9e12a913f344e4b2a3df2e526ca0fd0d993020ce80f1c59073f47b630ec45c0924ab415a3b517158632ef6c4545f5df85dd3375461fb926ae38dff6b02c1c784efe14306e77277206c523fdb59cd887172ef34118ceea4f7af70c6220d9b96fa2f4dd900783828075f107bf4fa6403a019e0cd32da73282262f79f65008fb81f2699f26cd9a40d550db8dc34373f67afd4fe510dddbefe05b200a63c08df26c00915f3af4179d22afb204d73e5213a0ef0834026210de60e5376b3e10e6a729fa7c10e24f43f2be1014ae01ce6b4241c177c10bdccaf34ed477f20a90df68d016bee44ab3ccc4ca9fff59d50a5a23530ca949a8482b362ce47fb66950775f1a5f8667e1bfab69a0b80cf340a5a08579063fb6fa00651d1a732e2e6420375d18d364fe4d59197c4cdf176119184467747ffa5c2fec0e471ef960af4c8068133c412243af73ebee27bc3ca1b3583ed258bb580f1c1892614009448021f002ea75a7407c5fff4306d1fb10c647b94e9f05d720711a0c86dd42734b4d558044a1b6abe26186fcd10e9315f91e8e9e5d5caf8f75a871fa51d4d31db3714d0083a9a991c76c3f64ceed6666fbe9318d35bac4d90f41391996e8d36ef3fb38d07be9854ca6ecfbfe850b9fa8df7a9f9d61d5dfbee2e94dc45e4f8eb5aa0214c0dccb9d8d794b62126d9d2bebeed2b0cd4a651be835814dc6fe7f9c8462fa1fa0288f79d1c57d93d78ac3a243aa986d25d1467da364d4f7d24ca87f8d228dc300c1305573dfae11237104d752b8f357251c9ca636a1238a6af1e4778b1cd52080a2fc51db0fdb2446436238b874bdbbe2a0ce709d5bab3b61a3e1100beec707606ab65b94a234597bb1d5a43a2560a2aaed34a0cd84b23cdddd8fe62901d466607830b404f731089b465bfac0eb2dad425c0337cfd522c82c0858ff1a5cdbb740a5f46cf1a0d0cc580a59e0ee3ee8f0a10fd0ad736ff625f9701eee17071547508dc9af8882ce859c0c2059ed95975e59e7a4837dc5d41ef703466042e42af820f91441341f9b5544971ba3a73412cd32568799b37199950a6c555220a2764a804b5a000a8917de0aa321a2c14b5cf917e9294228be6841db882a204cea3f622089cbe171bb66fd9be2c57c41370b151f73384e0014c62f2887caf627133b7390b9479b0a6fffd714587e5148c37a2c36ae4c90804e8bb76f19ef0294d2ed9e903b6b81732cd96b14a8e3bf9a799cc567a001d96a93b1e7020cec8223be6a24e08fb12a78dcb8b1493423b6b793e15ac044cd8877a9f188b04d75fe9db664bf3079a9e1833d52a6ae90b8ef6035d3a7a270145604fb8f0126016723989f36ee10c1231cc331838229d23398a3f5ba1ab513cffe02736d50a271b06fb471411080bf65d88c358118196caa6139f5547b23c8ec9716bf255e011ef34fa8df450690f1570cb49efec1d18a544bb12f62a77ee362f87d6aec546f866ae3b5beec14a00e2f5e22975e57eaffd8f2e61e0020f60554fcd06437ac44b17fa18f9a1a19902393c2547c461ae74d558c3e891d3e0796860f90e732dde7d6dd8b7837d7bbc0b06f169c360c6a10a34cde75dd44d479759fda0ed770f981959ba51a8a3c36401d255a485d963dba518f77b80d800c519b6ea6fc0d891565fdb5d2499b8797c01b9d14135b1b771bf5b0bceeb867c96ca3a849d63d54a97da843602cd853e6e0f998ebdde072b6cd6c41ebe953b83e441fd3c05f43a1fbd3107c4a933a9782d0f6433eb55959a29d6e8547289e15323bbd0475e7720844766108921a21f3aaa0b449f1000e572f8eeeec542fecee60a25b7f2028579aa8d09e0a89eae3e639e0d4b715d3040107e917aca0c00a3a34bcbfdb8828a923a86ac7b6bcd4e49bbf701bb76777cd7c8b0818c6d54195cd0b6abe622dbe235af34d46e4b2b4b08098203af285b5c82f48901da514ea170aeeb1467d9b0dfe93dd13fe77bad442876800b34fe8fa20416d59c24cc2c52666649c41dbef18bfc8e20355e01a8511096440542ad4120754aa5d6329f8438769033611c2b6f9e76da91a8a1e1c32d3615170ec14698eba97bfd43f6631660bf5540f2489ecbecdc2245db04d47e4d958ca302ee4d6cd49d0959f5e78cfaebd16d9fc20e2f1b368d11bf799fde7da6623015080415697f229117c8594dfd651e1546e0fb4c5de955f29c1682ea64d66f2cf70e4f70739dbd758924d3ff0b2a5eebe4df4c983dc87fa1c538afd577ea50db1603a1049fea11708f8717a69af52116c813cb6c3768f4e8bc1059ffa05bf1c8f101fc008f52c78ade2ad05eb615c51d735fdbf1876658a520cb9ac9eff79cb686007c2c0527cb87bb6ccacec90d72ffd0a5fffa02b77049140b4001ddee7f9b620de1483584e1d77b145253e54f42d765c81b2faa6c088d6f8ac752ca13959143055efa89727a5e1b33f184517591f82b94365c482949babaabb0e9e0143770cb0908050d3a707f8aed49b204f069b6edeb3033f50e6cbf512f56ad4c29e0272804fb980d90258bd19e9bc5defc343d972ca9ab34b79ff04232f91ec3355df8570fa11ac9006cb8d7077efc152c7c8acd9a4efdc4400493314b2577b8e7964f6a0c2164998a249fe1e4ef79e239e35538e40b6462571f831fe471a70d4959793a0b853cc62df373bb003a0fd101cb0ea58ada4f4b81cd2c4792aa0d7397d8c4e400d9be46beb88b6e383609f474fc0ec8c7bfc6b856ca9fc8eeb34627959466a70a2f59ae8a4ec03f704f5eacf6a2a45e3b2e032d863db10af1d980d34671718f0fac33c6d069cec8a585baa31d4c3f5ab680d2abf7c5d8493c8b48ae72e34d0709c67e619b3da64f170e85f05d3c1f9ee9b0384e33c98979e9dcf484706b01fa0ac0faaf8e5a39c59e3d1f87763755445364115ca6e6de6c86549c3feec513ab06c31c56566887fd06447009c6eca4ee2ab19c4b60c6d295a01820b0c5d6241706b4b23e2c7719a6d22c1c7282fc5339ba60bca07679a032b65b8e2fa1caa19a0d4e3f0009a881ce323e532de8590c7f108fafbcf5eaef192783c3a77c39018108d8fe929cb32e63a07278605ca96f508e813f61f15c6aa188a4f12046c1854608df8bf4ca401a7ef069f20a3721577fdba35532f611495b44c903f9b07cba6e0d7b8e7e3a0b8f153d11be77106796e40f4373c5a6c2135cabaf8088d3fadaf0096e24c32b77fe02127fc022480f48a9c0bb2d5f3b28dd6b014c96e577e402030027ec2cea903e1f3a738fcad43d35b7c98fe99452a3239850af1a7e04b4053901e5a1db832100c1fde18973329bd7f26e069da3145db8dd648eb56b06f3f4f204c95d5116e4ca26e6d2f8a2e126b96549ccf0a9aa3d2dd09a5fcb119566d19306181ae4aa558bdbb9f7a0d28a005a78d10735ec0efba77a896e65bbf072d99b0a5e384dcb6b82821729420bae0c769693e0842534b5924a61010c12aaf888f80bbd68c004f7f9cb20bfbc1ee30ccbc7200f46a1eb30dce5fafb23f947f0a7990e8727cbe29d8f47ce4be49883c23c74d87870bdc26a3e3f4621315a99684b6704cb6f5c4a5ae47a46b733b35df576e675f3c341e13b6d433153f4c7c6a41d720ba5411c89ab7176c25241ceed97e4eba1bbcf71a1063cd5ec2b5d1caa08b5e404a68048023e80368fd886fd2b79537d77ac8aa8c7ee684566b044d9df833ffd0f188ca11e7ea32e2ff9762aed03e4c1cb3d26520f7f294b98f5d8e9f7d0a58b0718b2952603aafcb8ae1f0d1606c4fbf4f2fc4e7403e3e9383afe7df28257ff057c4cd235193f340e5c69bd9536ae79eb8df5ea603c2840db741044c5549fa601c882094f0b657717558ac03adff45229e8c21e179ba2222c11715a62c05d8000f8a54047caa547c2ab0976c54705f62e231a93dfbbe697f0d7c7911588024d0bd81a3503822b903f94c2140d89955acfb9bae2363fa5cc5da204d7cbd0091305bd045bb9f5e366b9d97ca601566d272cd4ca00ff1fffc67d4375a3c48a73ac0b57d745ea59dc5508d5788199e08f55dfc0a2670cb46a5df69bfb91bdbe015b0405c4549f3df7f3606b7a8ab4fb88fa0c388bc3c000e771ba297623590a89c703a4ce491750a32ceb8d089a16f1638e30286a4f487b9094b282a74e60f643cc008ec0643fc0fd9a8bf236bb68334137fdde5f36c4fe8b70984b403e8b2a0a0c0ad038c06a166c7725b35eb88b1ad8193539e726066d5aedbd4d762b8889c17401b5fd1e524f09ac6b50aded5f1895c8966f4aee42f18ead4e04388a8b587b5807b048b4dddd3e8f93c3c190f4356eef4cacf74e3436c9fc0585f1847529533204a7e0d6691e9823de470c40719de7102932531754a047a7b2d51155141a9b8103736db55245b3472416869a9b884cd34075e9ef17eb6987d2650d6e67d8cc4f09b27a1fb88d5c8593a99fb86b3afdbb59d4e38b892da14cb34808b69a17d9b50f465a1f9335dac489b04a618417853aa7d218e8b074f7e918315beaa67fd034060afd70371afa39552ff4fb36ab60b660ccae7654b20fd5695f436c77db348a09ce8cbe00bf8b0bfe4fecd163fd0ad6d82edea807b53eccd4da5ebaa9c4c6a60bddb1001d2ca67ef61b2a4c0838523e21e690071a68138ea0a3b1442edc79050c5e36256ecbed6a45dabdad6f3a95d1b68fdc1aa2adfebb0840c8c08c4c370e0dcbdf50f987007de160eb0dae332a14915573eeaf3e4a4cbd1e82624bfb89b807e18b19fbc893e0a305c73cf80720c137639e4db221b4efa1752a58a0c713fd08b8ad7f91485455858ee7f18bb545faaee92ed852369079cf7cfa34c7a3ec170a3ef53d3bd90bd084408b19a51a37df5dd943455d17272cd3c4a17d57839db50acfa23ca6381715aeb099367c807a558739fb54aab6bdb2be627697be3c59430b035cc1286cbadf3941ed21b088eed324712d10d84d3732098758e8698f297a0036f1f04259a4c4915aa2477fb7ff7604f5badf0d82f7a6c1aebb890cbba2930fb798b39a3c17c93aab7c17600d602a607960b430e7b0c1083f013779e87f360d5aad243e4183d659d74cbc010cbcaccac8b521fec008d6f41ee9da281c8ba4016612da3c89a797e72b20dd9dec4cf4f6d7abecae7e92dc4921294fbe9ba5050a0290da3d240478a2aa9ab903598a1c2e4c1ae49b3cda256f93e0adc47117af00eb284981269c2d84f81337c955ccac7c7204ebf66ac4c427b333a356817d0c0c798c3142942c38e0fff390235c759844ebf6b68aa4d38739eb10e7f3c74a860a0a1e42f8b6419615dbc7e5b7d922a0210619696428b59db31fba40127e678f09f3f5478c444cd25f8a05980a57f6726b203d4c6515d8102f6921cd49de5aba0c7bf414e525562fba4635c48e2826b2a5b27f0ba209e2a9cf8e567400be16d107eb492a502510d64998a66c2a7f0f5f35a581d020f74cc810c2e0630c07d3a2004c97ad199baece8ed8de5959934abdbb91c0bf55be882c1fe9bc006b7997fc065bd0aa5d7f3f743d168305edd28bedb9e29e35f08f1829fdd76e6160047c810459bb343300b15705e7a4baa0706bcad439b6031ed9f51eabfe6d28f6295d5b0e7df324bb0579bde7de5111eb262f40ebbef1472705f3d24d3233ae8419e0a93eefb0456dd3ed5d11c08c9e74c0d3e01ffe251a855e282bbe8bb05b8f9850ca7ec6110d1287fef6c9b6d8cd6ce9ca4572e1e69a0cf9a2a33061608cce17e243188129ab80e8e378b91b82ce35349864021292e8bf6dc93874e47131748956eb1534db8588a14c983f8a732b42a8604a2a4e8412c3c09421d4012b3b43946d5427a633c0dfb46a287eb45c7e03edeb39f5a1651c91d4e0f37d1bac14547ce203f492af6dae5a8fa43fc6a47bc2d9bd67c0cd64809a0cbb6e6b77c3052136e0a95ba3c24401441ff09b808f11d72e09ad5b2fc6993dab16901f3307b0d44bf66a026c95207909b63f2d0712f56ef84d64d357650218bd47b88643ec33e16bbe4b6004068b383852e7b2dfe01aa19131b01a3f73f3ec7c9185a105627d33abc626e0796bcffb815cb59ff99c0208ed196e5b2183976989eec0fd674a7e5ef2386101107479d5bd25fccd320023c09bc520e8dc63a32363f30c34ec76ea52fe87930603febdc3995d331976973c9441c3c4695fb28d16f48382be3652c91ed960e3a8080a1dae2411ce6147557886bb42931f43a5a314759a94d0245e271feecc34fca0f78ecc30707e512b8b6243e642904e6ec3b7cce203cb0175063be19489aef2ec5757d5ce523b82cc6d52e4d3326c5125140483e3f1f62b31202c99cb342242822245b05626cafd968bac16865d84f00b9871c60fca1a36820de5cf7c170a61ec1bda20148400cac0ac7a7fa0ac3524498345d76eabc0e9f3b4811a46b58c38a09930188b934da042660a575f1943f6200c7de9d0a8ce39c466f97b98d7c4faaf08031d013eb6c14d9433b9d0ad27ca30b2c9d8b15935fddd1a2d567146feec90cea6f102d63a5f8de152c8046b256f6431b43bb7933f4aaa03b737971eed860d6e8ee3618372ffd45b811db2b7ee00cf09e23f76d5599247367d19e14330198d11da4307f6846b39c9d2df195233008ecdc21411a7e06ff7df4ef88a20bbf005f48e7b2f0d86069370ab0c0261c4d517d409ee3d1f0e2954b9881ecc38ba52ca07785d6b9124c652dfc8f65c3f7f17d27b3effcea6e7419aaf34812abf654cf6693682b1cbb90e042c9025d055ee65c0adbd1274e499b8c5317074171200f061d3935011c500486932d12861f2c630f69ffec343786bd0fe800aeb8d87b1638a54b706287a93a51d89767dca5461c78a38bb674bf0af50c1b874e3831a8d00ee4ef34c9ef679e5f721be5f556e4b27ad0bac0dd61fa23ea361ad9aed36d9e7c1a09f8ed918b8156334ac6c5ee9a35b2d83c9877644d656e6e4d526b547332c979e89d470ea9922f1d14f4377939c22f2863641ccfec54c9b978e733b8a5204b263e8320ea6978eabe88d635ce863a528dbc4f6409307c094ae8118e9e986850871d8bec9b0f786f095df4fd53cae855520142f8c975e64cd144ea9cc7ec155520f4805c2a47faed8ea931832f7ea2e4564fd1f66254f3d5385645f534df94206ac51a6e5c66fc0c74fdd470eb978ccfec1264d7e3224a7139a25062df38e9a08675c3125d956c9360ae8da2d105386c6b7d477f3b146ed6349ab3e58ad26c893edd83e37be29d65f5ad416fd57c9fd7eb612347dbc623c9b83e27ee9fe88acd3eb01ddd8211239d1f310ae130e9cd1e8baad9714609b49cc3cd8e63b49b8a4455b35f542f1e77ce518fadaf7e9283ff85423bc08a1c6b0ef4c775bae7ffb1d30682f68b4cf2bebba8a80d21b8d6725ab7139fa5a756fa5e5cf9cfb987c75a2670b852c37404d7420d7e589ee068d3794af7da915c0777e5d7a644f3c7a459c41b25957268e6f65bd9b774132107ccd52fabfa930c735a2660aa7f2dc50aa94d19200da5f67242dddc769a609be98b1b6395e35e2f8ff7af3a3c21fc0c51963989c175c70a2811efe745f4d54f888f4945215b6e77c083fa333ff2a39bcf88eefbdbe9c8609e26dc815c34ed3dce51e6bd567ee9a55fc99f4d798cdf02c0f2683241975fde3a6ced99f00f6051af0b2d5270743c6e3c8cfb0c52c42ff745dd68ccf3c7e4de4a452ee8af61783472dc35c1f560407fb04a34586549318feb253d842ee5abce30b7e1b4dd48fce99adb8597fe9901bfecf4821143c3f5c65f78af06a9eec56396be5fafd3c305971480cbb37f2983912d2d14955a6c8adbfde7a7c402dcf5cc01851b69cc250058aec8599aa99e477c70b20ed0457828da299c57a6f7816695d29840b904ec89e75b013597bc8ca8539d6774a11f0cca10eb3c485c7db8402733c35c6fe1c84498b617a937526734552dae41d449106541051925fd7023a499a330d6e923478670b68ab8758d0eefe2708f7d3fe914d22ff3fd8ef4c54682d35685b6153792570c462b6fcd40b701806cf8151d49382a596537b8b59f84c92f3a0dced69989309ff2eb5f9d2e1456eb0632498f3e219ebfa41c8b3cf549705f05c129bcdc5bfdfda3913abffb11ea9c241a6f7c862757c85e0914a7624af8881e4831e1a45c75182291ad206bf1d517a0aa270133dd0382ebb1c18fb13fb8a06ec2204fa0c719c2362e1b4d204f595055d44127f03cb4cbb7d5dbd824e57442176bb62a4b121f78a639692d3aa07367668903e8bdfe987a47f0914a13a6f1e9147a9734a1f20474db8f7091101931316eaa832435a515a4a85a3aa073e224e7ce3b633eed2170b472ffd57fd4d4a21686194235c982402003ce2145485929c9daf16e56d868eedb17211d9f9e54064f313f20b7be6dff2ba959e6b606d15c9dbacb6b1e7c959192875846a181b2b01e7bab35bb350e7aa25303da8012fb34bc9c8c3e9cf8e3684fd2a4df573f58ebba64e7a281df68af7f01b9c52c217526c2693013ea75463a91f1ecb480152417a030b0dedde821f026b0a0da354f80577ed7a6602c7b245523be36cbdf1fc6247cf48f0500b77694a20b9004eaab7de24817e41006aa339dd1d868cf462f8020ac0b750c04cd9159e35c0047990a9b2f64a4a12b5b9fd398708010fa8acd1a0529cf951bac27d4426ea1f0beeb675c5276e165be24f96352ffb3ed9fc300247c67e441244de9bf2bd089e054b491c59599e08a12f143b3cb05bdcc4d960e766b9ad8a867474794d2ee9d70089f5ac50464570afabbedf95751155a6db5a7b1dd35041f6ae6cda044bda0d050f651cade94464cd5cdb9a5c5eda241938815088c8daf2128d5f927c00afce0777c53cd37052f10e7b6fe4615933980bb206edd634fb8a07fc2a25f20d9d170faa35d6d757327cb36a4020db39adf349fb0ba6289a053d08fd4fbd028790db094c93015e046a3cfc9efdd24e82a32a6f3ee31612d93433cdd8f6f1440275be06318ae47e387998b74f361ce18d05664b6303df78bbc88e7009ecca88a95fe20ffddb812fba78fa4a7766437f4b82b1c4d993f95f9d1d6ca4f6b4c452b2d49e076222783d7da87bace2f2fc9690ea1fc88d16253e41275985d254fa05fdff5c0f212735c522cfa7c471da193eae9798c77fa73f2098d6239e90abec219a42de04243fbb630987511c932e4f5812d6a1ad68fc011166cae9dddc416ef9ca659102668441ab3f5e694de6d5672aae78d7f26587d6de4347f646f18aec694048d3095fc1c5437fe5241946b2621c0e2e64430a955cb64f1b72203eb5e6f3c700c50f6648301ca2b39786b52f4c2368221e20a6538f62386d5eb487c269c5837c360fb2b1a7cdf3223ed190814423313ab568d2850402eb4dc8585a50e78642d7eb0699a99638c4efd40fe072990dca39e62b3a226a6e16bddc06f912f2aa4c1e4e0846112219d272324729c70bd31f502e525f31824560ae9e27c53893efbfc21e052954252411ed55998f9bfe10791cb9105db581c7d0cb404a56b98570f275d605403ca38117f48d00bb2ec4a7eca7ac714c10b4d3476886b9c43a6f1c5b218e02a8615133ff5076eecf162a60b35a22a3c5209cfb4dee70882624696270662105cff0f669794583131c9895be2e1804aa34db8a4cab4ec4385e0e586057e7d20cbe2938b452ec26e24aa3076946318d1a8cf9b167d8c845ccfaaafc9cabecd40a56d41ae11d130f59706eff10a6716762c9415098aaacd1ee168b5aa48113ab07f1f4f1c437a4b0bacb993ad2ea5d6accf1fd3d44bcc4799d00be814e5640460a0b1af239c9577b9bca4c28eca9dfd0ab14d56143d545c607fb8360bc8a72240f49163d52793a613f888c0ed2ca80e14b8eb0134937ab2845b613eb297ea2bf0e3bff7776b5041d72b159d35d66531323bb06cab1f2bf4c2e3bf82149c15be90da9d16fbba1c95dd8a7389d8a49a2807a211647598d3e48e17279167431b0010236e1f44d50c20287a97f93db3403693986b80148391498ca3910e76eb22c4c0aac072ae2c395f349cab30f172c1fed58c0c794aab50013f89e7a7ff04012c309e2405895217a5b269f69408163187f11aab247c007a19deca078d3b806db8b07b105a1bfaffd68e46691ba329063008de7c2e29dcc9eedee5b56780a19c4bd0c8d7b449ec1cafa8692b6d99cb717c85524fb49117cc898759a32f2bde5929a07e698f367eb4a2ab8e0fd27cecff715d43d5f8176d2a6cd6ebbf9743ae65ff30b5b38e784396114aa8c11986c6ed6f3cbfaba450a5f64cee6e318a027069d0603342a3e7d5d8c8cf2db906b3b6938a5663d038fc859030e2ef51de31f2ac07d054034dc11841ee579830ca2a7ebd79ca4e7d38684f545f40e855ac31b008e4f08ba11f605335c12eaa0a8151831bcef248ae575ad2cb58dbcd1a65ace2941310a1cb9a0992469a0aff7a0349c10b0be3b69f9c6524dc632a56550ca7274ac6c00d7d2f35d0ce497933ba1b62ef6ef125219d0af6606c16c52bf27fda2a8e8b50c1c31ec34145f94b74acd3829475bbec586b67122d762d58a570523574a183d0c1fd73188f146904ff028b78146b5153f2ff8e50c114178fbef186f43df4e05036d65b8e13563680029c792a2ef9eb5ab8b4c80497cbf3850d5e005a7f74d0c02b3e2be2619d849d88303f7498ffa5cdf22704c42770e5b50c37259e5e723b401ea26cfc4c878cdd1eeec04d16b3b20a71f3aa2d138155e7d38a8b1231082460f8614adedae0492ba17affbd3fc7df04666371f9d63c5df6d81e63986bd2903090a769aa051f417b045360474a18af5d227432b8f10daac14f65b56132365ef079f8681f9cc38ff7a3239cd8788078e7dc8f249b646aa1f47b766da335804e1042e7d2be51ec102d7ef8453ec8773d7cc24e2d518f40a3dfa0230092fe498ac021553a6af20de39470d81f815f4e1fc1216aa227d8c0ac9138daa3406f769ba07

unable to compile

/root/monero/build/release/src/cryptonote_core/libcryptonote_core.a(blockchain.cpp.o): In function cryptonote::Blockchain::Blockchain(cryptonote::tx_memory_pool&)': blockchain.cpp:(.text+0x823a): undefined reference to cryptonote::checkpoints::checkpoints()'

/root/monero/build/release/src/cryptonote_core/libcryptonote_core.a(blockchain.cpp.o): In function cryptonote::Blockchain::handle_block_to_main_chain(cryptonote::block const&, crypto::hash const&, cryptonote::block_verification_context&)': blockchain.cpp:(.text+0x1de18): undefined reference to cryptonote::checkpoints::is_in_checkpoint_zone(unsigned long) const'
blockchain.cpp:(.text+0x1de36): undefined reference to `cryptonote::checkpoints::check_block(unsigned long, crypto::hash const&) const'

/root/monero/build/release/src/cryptonote_core/libcryptonote_core.a(blockchain.cpp.o): In function cryptonote::Blockchain::check_against_checkpoints(cryptonote::checkpoints const&, bool)': blockchain.cpp:(.text+0x210c9): undefined reference to cryptonote::checkpoints::get_points() const'
blockchain.cpp:(.text+0x21175): undefined reference to `cryptonote::checkpoints::check_block(unsigned long, crypto::hash const&) const'

/root/monero/build/release/src/cryptonote_core/libcryptonote_core.a(blockchain.cpp.o): In function cryptonote::Blockchain::update_checkpoints(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)': blockchain.cpp:(.text+0x21503): undefined reference to cryptonote::checkpoints::load_checkpoints_from_json(std::__cxx11::basic_string<char, std::char_traits, std::allocator >)'
blockchain.cpp:(.text+0x2158a): undefined reference to cryptonote::checkpoints::checkpoints()' blockchain.cpp:(.text+0x21594): undefined reference to cryptonote::checkpoints::load_checkpoints_from_dns(bool)'
blockchain.cpp:(.text+0x2159f): undefined reference to cryptonote::checkpoints::check_for_conflicts(cryptonote::checkpoints const&) const' blockchain.cpp:(.text+0x216a3): undefined reference to cryptonote::checkpoints::load_checkpoints_from_dns(bool)'

/root/monero/build/release/src/cryptonote_core/libcryptonote_core.a(blockchain.cpp.o): In function cryptonote::Blockchain::handle_alternative_block(cryptonote::block const&, crypto::hash const&, cryptonote::block_verification_context&)': blockchain.cpp:(.text+0x22660): undefined reference to cryptonote::checkpoints::is_alternative_block_allowed(unsigned long, unsigned long) const'
blockchain.cpp:(.text+0x23362): undefined reference to `cryptonote::checkpoints::check_block(unsigned long, crypto::hash const&, bool&) const'
collect2: error: ld returned 1 exit status

What is crypto.js for?

There is a minified js file crypto.js, what is this for and why is it minified?

Running it through a js formatter gives us a a file which is ~17,000 lines long (see gist link below). Why is all of this code necessary? Looking at the code there are a lot of functions which I don't see having anything to do with monero i.e. function fullScreenChange()
https://gist.github.com/evanrolfe/5e7951975b3707835f764e642e952de4#file-crypto-js-L4720

Maybe I'm missing something but if openmonero / mymonero are open source applications which run in your browser, doesn't having a minified file like crypto.js make it harder for users to verify the source code doesn't contain anything malicious?

Does not generate bulletproof txs.

Just like with introduction of RingCT, MyMonero/OpenMonero frontend fails to generate proper tx (i.e., bulletproof). So testnet v7 does not accept it.

[feature] make url for to view only wallets

Currently, to use viewonly wallet, have to give address+viewkey in a login form. Its can be anoying if you want to share or often access your viewonly wallet.

What if there was a way to login to your viewonly wallet using address+viewkey in url, e.g.,

http://mainurl.com/viewonly?address=<address>&viewkey=<viewkey>

This way would be easy to save, share or access your view wallets?

Fails to run on Raspberry Pi 3 Model B

On the latest Raspbian Stretch with Desktop:

pi@raspberrypi:~/github/openmonero $ mysql --version
mysql  Ver 15.1 Distrib 10.1.23-MariaDB, for debian-linux-gnueabihf (armv7l) using readline 5.2
pi@raspberrypi:~/github/openmonero $ sudo mysql -u root -p < sql/openmonero.sql 
Enter password: 
pi@raspberrypi:~/github/openmonero $ sudo build/openmonero
Blockchain path: /home/pi/.bitmonero/lmdb
Check block height: 140059 no of mempool txs: 0
terminate called after throwing an instance of 'mysqlpp::ConnectionFailed'
terminate called recursively
Aborted

I'm fairly certain that I got the config file (root password etc) right. Can it be that the specific MySQL version available on Raspbian has some problems?

FWIW, the daemon is still far from being fully synced:

status
Height: 140160/1452780 (9.6%) on mainnet, not mining, net hash 19.58 MH/s, v1, up to date, 9(out)+0(in) connections, uptime 0d 1h 57m 10s

Could this have anything to do with the crash?

get_unspent_outs required arguments

Noticed OpenMonero requires the parameters "mixin", "use_dust" and "dust_threshold" while MyMonero doesn't. Skimmed through the code and could see that mixin and use_dust parameters were used. Am I missing something?

MySqlAccounts.cpp(select_for_out) on line 102

Thread exisist, dont make new one
Search thread started
new last_ping_timestamp: 1509462419
Pinging mysql failed. stoping mysql pinging thread.
[Thread 0x7ffdfe089700 (LWP 3481) exited]
# ERR: SQLException in /home/mwo/openmonero/src/MySqlAccounts.cpp(select_for_out) on line 102
# ERR: Lost connection to MySQL server during query
terminate called after throwing an instance of 'mysqlpp::Exception'
  what():  Lost connection to MySQL server during query

Linking errors

I'm trying to compile openmonero but getting this error:

...
[100%] Linking CXX executable openmonero
/usr/bin/ld: cannot find -lcryptoxmr
collect2: error: ld returned 1 exit status
CMakeFiles/openmonero.dir/build.make:128: recipe for target 'openmonero' failed
make[2]: *** [openmonero] Error 1
CMakeFiles/Makefile2:69: recipe for target 'CMakeFiles/openmonero.dir/all' failed
make[1]: *** [CMakeFiles/openmonero.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

I tried it with Ubuntu 16.04 and 17.04 and various versions of the monero code but nothing works.

Any ideas?

crash on startup (std::system_error) on pine64

Managed to get openmonero running on my pine64 yesterday. Today it's crashing on startup. Daemon (testnet) is running, fully synced. Any clues?

$ ./openmonero -t
Blockchain path: /media/external/testnet/lmdb
2017-07-22 08:00:40.365	      7f991c4000	INFO 	global	contrib/epee/src/mlog.cpp:145	New log categories: *:WARNING,net:FATAL,net.p2p:FATAL,net.cn:FATAL,global:INFO,verify:FATAL,stacktrace:INFO
Check block height: 959259 no of mempool txs: 0
Start the service at http://localhost:1984
terminate called after throwing an instance of 'std::system_error'
terminate called recursively
Aborted

Full BT https://paste.fedoraproject.org/paste/fxZOx9rg3TuRJVqHiYpHJQ/raw

recipe for target 'src/CMakeFiles/myxrm.dir/tools.cpp.o' failed

Compilation fails on Ubuntu 16.04 with latest monero master and the compile_with_current_moner branch:

Trace:

# make
[  2%] Building CXX object ext/restbed/CMakeFiles/restbed.dir/source/corvusoft/restbed/detail/web_socket_impl.cpp.o
[  5%] Building CXX object ext/restbed/CMakeFiles/restbed.dir/source/corvusoft/restbed/detail/web_socket_manager_impl.cpp.o
[  8%] Linking CXX static library librestbed.a
[ 56%] Built target restbed
Scanning dependencies of target myxrm
[ 59%] Building CXX object src/CMakeFiles/myxrm.dir/MicroCore.cpp.o
[ 62%] Building CXX object src/CMakeFiles/myxrm.dir/tools.cpp.o
/root/openmonero/src/tools.cpp: In function ‘std::array<unsigned int, 5u> xmreg::timestamp_difference(uint64_t, uint64_t)’:
/root/openmonero/src/tools.cpp:751:47: warning: narrowing conversion of ‘time_diff_years’ from ‘uint64_t {aka long long unsigned int}’ to ‘unsigned int’ inside { } [-Wnarrowing]
                              time_diff_seconds};
                                               ^
/root/openmonero/src/tools.cpp:751:47: warning: narrowing conversion of ‘time_diff_days’ from ‘uint64_t {aka long long unsigned int}’ to ‘unsigned int’ inside { } [-Wnarrowing]
/root/openmonero/src/tools.cpp:751:47: warning: narrowing conversion of ‘time_diff_hours’ from ‘uint64_t {aka long long unsigned int}’ to ‘unsigned int’ inside { } [-Wnarrowing]
/root/openmonero/src/tools.cpp:751:47: warning: narrowing conversion of ‘time_diff_minutes’ from ‘uint64_t {aka long long unsigned int}’ to ‘unsigned int’ inside { } [-Wnarrowing]
/root/openmonero/src/tools.cpp:751:47: warning: narrowing conversion of ‘time_diff_seconds’ from ‘uint64_t {aka long long unsigned int}’ to ‘unsigned int’ inside { } [-Wnarrowing]
/root/openmonero/src/tools.cpp: In function ‘std::__cxx11::string xmreg::decrypt(const string&, const secret_key&, bool)’:
/root/openmonero/src/tools.cpp:931:39: error: ‘chacha8_iv’ was not declared in this scope
     const size_t prefix_size = sizeof(chacha8_iv)
                                       ^
/root/openmonero/src/tools.cpp:939:5: error: ‘chacha8_key’ is not a member of ‘crypto’
     crypto::chacha8_key key;
     ^
/root/openmonero/src/tools.cpp:940:5: error: ‘generate_chacha8_key’ is not a member of ‘crypto’
     crypto::generate_chacha8_key(&skey, sizeof(skey), key);
     ^
/root/openmonero/src/tools.cpp:940:55: error: ‘key’ was not declared in this scope
     crypto::generate_chacha8_key(&skey, sizeof(skey), key);
                                                       ^
/root/openmonero/src/tools.cpp:940:55: note: suggested alternative:
In file included from /root/moneroyy/src/cryptonote_basic/cryptonote_basic.h:52:0,
                 from /root/moneroyy/src/cryptonote_basic/cryptonote_basic_impl.h:33,
                 from /root/moneroyy/src/cryptonote_core/tx_pool.h:44,
                 from /root/openmonero/src/monero_headers.h:24,
                 from /root/openmonero/src/tools.h:16,
                 from /root/openmonero/src/tools.cpp:5:
/root/moneroyy/src/ringct/rctTypes.h:77:12: note:   ‘rct::key’
     struct key {
            ^
/root/openmonero/src/tools.cpp:942:19: error: ‘chacha8_iv’ in namespace ‘crypto’ does not name a type
     const crypto::chacha8_iv &iv = *(const crypto::chacha8_iv*)&ciphertext[0];
                   ^
/root/openmonero/src/tools.cpp:967:48: error: ‘iv’ was not declared in this scope
     crypto::chacha8(ciphertext.data() + sizeof(iv),
                                                ^
src/CMakeFiles/myxrm.dir/build.make:86: recipe for target 'src/CMakeFiles/myxrm.dir/tools.cpp.o' failed
make[2]: *** [src/CMakeFiles/myxrm.dir/tools.cpp.o] Error 1
CMakeFiles/Makefile2:124: recipe for target 'src/CMakeFiles/myxrm.dir/all' failed
make[1]: *** [src/CMakeFiles/myxrm.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

Calculation error : the final balance is different from the monero-wallet-cli on mainnet

Openmonero reports a different value of the final balance compared to monero-wallet-cli on mainnet.
According to openmonero I've 159XMR but the monero-wallet-cli and monero-wallet-gui reports that I've 5.25XMR.
I tried to reimport twice by erasing the MySQL database and I got two different value on the two trials.
Openmonero:
Monero wallet cli:
Monero wallet gui:

add Readline dependency

Recent monero master builds with readline support by default, if it's installed on the system. OpenMonero build (upgrade_angular_js branch) fails if monero is built with readline support. As a workaround you can turn off readline in monero's CMakeLists.txt.

[ 97%] Linking CXX executable openmonero
/home/jaquee/monero/build/release/contrib/epee/src/libepee.a(readline_buffer.cpp.o): In function `attempted_completion(char const*, int, int)':
readline_buffer.cpp:(.text+0x2): undefined reference to `rl_attempted_completion_over'
/home/jaquee/monero/build/release/contrib/epee/src/libepee.a(readline_buffer.cpp.o): In function `startup_hook()':
readline_buffer.cpp:(.text+0xcf): undefined reference to `rl_bind_key'
readline_buffer.cpp:(.text+0xde): undefined reference to `rl_bind_key'
/home/jaquee/monero/build/release/contrib/epee/src/libepee.a(readline_buffer.cpp.o): In function `rdln::readline_buffer::sync()':
readline_buffer.cpp:(.text+0x11b): undefined reference to `rl_end'
readline_buffer.cpp:(.text+0x124): undefined reference to `rl_point'
readline_buffer.cpp:(.text+0x129): undefined reference to `rl_copy_text'
readline_buffer.cpp:(.text+0x136): undefined reference to `rl_set_prompt'
readline_buffer.cpp:(.text+0x142): undefined reference to `rl_replace_line'
readline_buffer.cpp:(.text+0x147): undefined reference to `rl_redisplay'
readline_buffer.cpp:(.text+0x1e6): undefined reference to `rl_set_prompt'
readline_buffer.cpp:(.text+0x1f0): undefined reference to `rl_replace_line'
readline_buffer.cpp:(.text+0x1f7): undefined reference to `rl_point'
readline_buffer.cpp:(.text+0x1fc): undefined reference to `rl_redisplay'
/home/jaquee/monero/build/release/contrib/epee/src/libepee.a(readline_buffer.cpp.o): In function `handle_line(char*)':
readline_buffer.cpp:(.text+0x2d3): undefined reference to `rl_set_prompt'
readline_buffer.cpp:(.text+0x2d9): undefined reference to `rl_already_prompted'
/home/jaquee/monero/build/release/contrib/epee/src/libepee.a(readline_buffer.cpp.o): In function `handle_enter(int, int)':
readline_buffer.cpp:(.text+0x362): undefined reference to `rl_end'
readline_buffer.cpp:(.text+0x369): undefined reference to `rl_copy_text'
readline_buffer.cpp:(.text+0x376): undefined reference to `rl_crlf'
readline_buffer.cpp:(.text+0x37b): undefined reference to `rl_on_new_line'
readline_buffer.cpp:(.text+0x385): undefined reference to `rl_set_prompt'
readline_buffer.cpp:(.text+0x394): undefined reference to `rl_replace_line'
readline_buffer.cpp:(.text+0x399): undefined reference to `rl_redisplay'
readline_buffer.cpp:(.text+0x507): undefined reference to `add_history'
readline_buffer.cpp:(.text+0x542): undefined reference to `rl_done'
readline_buffer.cpp:(.text+0x5ff): undefined reference to `rl_set_prompt'
readline_buffer.cpp:(.text+0x604): undefined reference to `rl_on_new_line_with_prompt'
readline_buffer.cpp:(.text+0x609): undefined reference to `rl_redisplay'
/home/jaquee/monero/build/release/contrib/epee/src/libepee.a(readline_buffer.cpp.o): In function `rdln::readline_buffer::set_prompt(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
readline_buffer.cpp:(.text+0x7aa): undefined reference to `rl_set_prompt'
readline_buffer.cpp:(.text+0x7af): undefined reference to `rl_redisplay'
/home/jaquee/monero/build/release/contrib/epee/src/libepee.a(readline_buffer.cpp.o): In function `rdln::readline_buffer::process()':
readline_buffer.cpp:(.text+0x88c): undefined reference to `rl_callback_read_char'
/home/jaquee/monero/build/release/contrib/epee/src/libepee.a(readline_buffer.cpp.o): In function `rdln::readline_buffer::start()':
readline_buffer.cpp:(.text+0x9c5): undefined reference to `rl_startup_hook'
readline_buffer.cpp:(.text+0x9d0): undefined reference to `rl_attempted_completion_function'
readline_buffer.cpp:(.text+0x9d9): undefined reference to `rl_callback_handler_install'
/home/jaquee/monero/build/release/contrib/epee/src/libepee.a(readline_buffer.cpp.o): In function `rdln::readline_buffer::stop()':
readline_buffer.cpp:(.text+0xa94): undefined reference to `rl_replace_line'
readline_buffer.cpp:(.text+0xa9e): undefined reference to `rl_set_prompt'
readline_buffer.cpp:(.text+0xaa3): undefined reference to `rl_redisplay'
readline_buffer.cpp:(.text+0xaad): undefined reference to `rl_unbind_key'
readline_buffer.cpp:(.text+0xab7): undefined reference to `rl_unbind_key'
readline_buffer.cpp:(.text+0xabc): undefined reference to `rl_callback_handler_remove'
/home/jaquee/monero/build/release/contrib/epee/src/libepee.a(readline_buffer.cpp.o): In function `rdln::suspend_readline::~suspend_readline()':
readline_buffer.cpp:(.text+0xcb5): undefined reference to `rl_startup_hook'
readline_buffer.cpp:(.text+0xcc0): undefined reference to `rl_attempted_completion_function'
readline_buffer.cpp:(.text+0xcc9): undefined reference to `rl_callback_handler_install'
/home/jaquee/monero/build/release/contrib/epee/src/libepee.a(readline_buffer.cpp.o): In function `rdln::suspend_readline::suspend_readline()':
readline_buffer.cpp:(.text+0xdc3): undefined reference to `rl_replace_line'
readline_buffer.cpp:(.text+0xdcd): undefined reference to `rl_set_prompt'
readline_buffer.cpp:(.text+0xdd2): undefined reference to `rl_redisplay'
readline_buffer.cpp:(.text+0xddc): undefined reference to `rl_unbind_key'
readline_buffer.cpp:(.text+0xde6): undefined reference to `rl_unbind_key'
readline_buffer.cpp:(.text+0xdeb): undefined reference to `rl_callback_handler_remove'
/home/jaquee/monero/build/release/contrib/epee/src/libepee.a(readline_buffer.cpp.o): In function `attempted_completion(char const*, int, int)':
readline_buffer.cpp:(.text+0x10): undefined reference to `rl_completion_matches'
collect2: error: ld returned 1 exit status
CMakeFiles/openmonero.dir/build.make:130: recipe for target 'openmonero' failed
make[2]: *** [openmonero] Error 1
CMakeFiles/Makefile2:69: recipe for target 'CMakeFiles/openmonero.dir/all' failed
make[1]: *** [CMakeFiles/openmonero.dir/all] Error 2
Makefile:116: recipe for target 'all' failed
make: *** [all] Error 2

Error: Can't connect to the backend! Maybe its down.

Ubuntu Server 16.04
Provider is Scaleway.com
box size is C2L, 8cpu32ram

steps to reproduce
https://github.com/moneroexamples/openmonero/blob/master/README.md
chrome browser - exampleapp.com/

result is that the app successfully creates a mnemonic key, however there is a notification on the splash page that says Error: Can't connect to the backend! Maybe its down.

pasting the mnemonic key in the box below it after being created gives the following error: server error.

a clue, the title bar branding says "testnet" despite all testnet options set to false as well as openmonero being run without the testnet option.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.