Giter Club home page Giter Club logo

riffcash-core's Introduction

Riffcash Core integration/staging tree

Build Status

https://riffcash.org

What is Riffcash?

Riffcash is an experimental digital currency that enables instant payments to anyone, anywhere in the world. Riffcash uses peer-to-peer technology to operate with no central authority: managing transactions and issuing money are carried out collectively by the network. Riffcash Core is the name of open source software which enables the use of this currency.

For more information, as well as an immediately useable, binary version of the Riffcash Core software, see https://riffcash.org.

License

Riffcash Core is released under the terms of the MIT license. See COPYING for more information or see https://opensource.org/licenses/MIT.

Development Process

The master branch is regularly built and tested, but is not guaranteed to be completely stable. Tags are created regularly to indicate new official, stable release versions of Riffcash Core.

The contribution workflow is described in CONTRIBUTING.md.

The developer mailing list should be used to discuss complicated or controversial changes before working on a patch set.

Developer IRC can be found on Freenode at #riffcash-dev.

Testing

Testing and code review is the bottleneck for development; we get more pull requests than we can review and test on short notice. Please be patient and help out by testing other people's pull requests, and remember this is a security-critical project where any mistake might cost people lots of money.

Automated Testing

Developers are strongly encouraged to write unit tests for new code, and to submit new unit tests for old code. Unit tests can be compiled and run (assuming they weren't disabled in configure) with: make check. Further details on running and extending unit tests can be found in /src/test/README.md.

There are also regression and integration tests, written in Python, that are run automatically on the build server. These tests can be run (if the test dependencies are installed) with: test/functional/test_runner.py

The Travis CI system makes sure that every pull request is built for Windows, Linux, and OS X, and that unit/sanity tests are run automatically.

Manual Quality Assurance (QA) Testing

Changes should be tested by somebody other than the developer who wrote the code. This is especially important for large or high-risk changes. It is useful to add a test plan to the pull request description if testing the changes is not straightforward.

Translations

We only accept translation fixes that are submitted through Bitcoin Core's Transifex page. Translations are converted to Riffcash periodically.

Translations are periodically pulled from Transifex and merged into the git repository. See the translation process for details on how this works.

Important: We do not accept translation changes as GitHub pull requests because the next pull from Transifex would automatically overwrite them again.

riffcash-core's People

Contributors

kernelpanek avatar

Watchers

 avatar  avatar

riffcash-core's Issues

Failures in test_riffcash

One of the tests "tx_vald" fails with runtime_error, the details are shown below:

idx:200, transaction:0100000000010200010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff01d00700000000000001510003483045022100e078de4e96a0e05dcdc0a414124dd8475782b5f3f0ed3f607919e9a5eeeb22bf02201de309b3a3109adb3de8074b3610d4cf454c49b61247a2779a0bcbf31c8819765032103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc711976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac00000000
unknown location(0): fatal error in "tx_valid": std::runtime_error: CDataStream::read(): end of data: iostream error
test/transaction_tests.cpp(177): last checkpoin

Test failures when running python unit tests

There are test failures when running python unit tests:

To reproduce,
test/functional/test_runner.py

...............
uptime.py passed, Duration: 8 s
....................
listsinceblock.py passed, Duration: 42 s
.
resendwallettransactions.py passed, Duration: 11 s
.................................................................
wallet-hd.py passed, Duration: 597 s
.............
import-rescan.py passed, Duration: 92 s

TEST                           | STATUS    | DURATION

abandonconflict.py             | ✓ Passed  | 36 s
bip65-cltv-p2p.py              | ✖ Failed  | 0 s
bip68-112-113-p2p.py           | ✖ Failed  | 0 s
bipdersig-p2p.py               | ✖ Failed  | 0 s
blockchain.py                  | ✓ Passed  | 14 s
bumpfee.py                     | ✖ Failed  | 0 s
decodescript.py                | ✖ Failed  | 0 s
disablewallet.py               | ✓ Passed  | 4 s
disconnect_ban.py              | ✖ Failed  | 0 s
fundrawtransaction.py          | ✓ Passed  | 172 s
getchaintips.py                | ✓ Passed  | 27 s
httpbasics.py                  | ✓ Passed  | 17 s
import-rescan.py               | ✓ Passed  | 92 s
importmulti.py                 | ✓ Passed  | 56 s
importprunedfunds.py           | ✓ Passed  | 21 s
invalidblockrequest.py         | ✖ Failed  | 0 s
invalidtxrequest.py            | ✖ Failed  | 0 s
keypool-topup.py               | ✓ Passed  | 97 s
keypool.py                     | ✓ Passed  | 21 s
listsinceblock.py              | ✓ Passed  | 42 s
listtransactions.py            | ✖ Failed  | 0 s
mempool_limit.py               | ✓ Passed  | 24 s
mempool_persist.py             | ✖ Failed  | 0 s
mempool_reorg.py               | ✓ Passed  | 15 s
mempool_resurrect_test.py      | ✓ Passed  | 8 s
mempool_spendcoinbase.py       | ✓ Passed  | 5 s
merkle_blocks.py               | ✓ Passed  | 36 s
mining.py                      | ✖ Failed  | 0 s
multi_rpc.py                   | ✓ Passed  | 12 s
multiwallet.py                 | ✓ Passed  | 27 s
net.py                         | ✓ Passed  | 14 s
nulldummy.py                   | ✖ Failed  | 0 s
p2p-compactblocks.py           | ✖ Failed  | 0 s
p2p-fullblocktest.py           | ✖ Failed  | 0 s
p2p-leaktests.py               | ✖ Failed  | 0 s
p2p-mempool.py                 | ✖ Failed  | 0 s
p2p-segwit.py                  | ✖ Failed  | 0 s
p2p-versionbits-warning.py     | ✖ Failed  | 0 s
preciousblock.py               | ✓ Passed  | 25 s
prioritise_transaction.py      | ✖ Failed  | 0 s
proxy_test.py                  | ✓ Passed  | 23 s
rawtransactions.py             | ✓ Passed  | 54 s
receivedby.py                  | ✓ Passed  | 44 s
reindex.py                     | ✓ Passed  | 27 s
resendwallettransactions.py    | ✓ Passed  | 11 s
rest.py                        | ✓ Passed  | 35 s
rpcnamedargs.py                | ✓ Passed  | 7 s
segwit.py                      | ✖ Failed  | 0 s
sendheaders.py                 | ✖ Failed  | 0 s
signmessages.py                | ✓ Passed  | 8 s
signrawtransactions.py         | ✓ Passed  | 8 s
test_script_address2.py        | ✓ Passed  | 27 s
txn_clone.py                   | ✓ Passed  | 34 s
txn_doublespend.py --mineblock | ✓ Passed  | 36 s
uptime.py                      | ✓ Passed  | 8 s
wallet-accounts.py             | ✓ Passed  | 74 s
wallet-dump.py                 | ✓ Passed  | 30 s
wallet-encryption.py           | ✓ Passed  | 20 s
wallet-hd.py                   | ✓ Passed  | 597 s
wallet.py                      | ✓ Passed  | 179 s
walletbackup.py                | ✖ Failed  | 269 s
zapwallettxes.py               | ✓ Passed  | 34 s
zmq_test.py                    | ✓ Passed  | 15 s

ALL                            | ✖ Failed  | 2305 s (accumulated) 

test_riffcash-qt test failures

The following unit tests fail when running test_riffcash-qt:

******** Start testing of RPCNestedTests *********
Config: Using QtTest library 5.5.1, Qt 5.5.1 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 5.4.0 20160609)
PASS   : RPCNestedTests::initTestCase()
FAIL!  : RPCNestedTests::rpcNestedTests() 'result == "97ddfbbae6be97fd6cdf3e7ca13232a3afff2353e29badfab7f73011edd4ced9"' returned FALSE. ()
   Loc: [qt/test/rpcnestedtests.cpp(82)]
PASS   : RPCNestedTests::cleanupTestCase()
Totals: 2 passed, 1 failed, 0 skipped, 0 blacklisted

walletbackup.py unit test fails with socket timeout exception

There are a few unit tests in the python test suite that are failing with socket timeout exception. Need to investigate whether the issue is benign or there is a deeper problem with the blockchain daemon. The details of the exception are shown below:

walletbackup.py failed, Duration: 248 s

stdout:
2018-02-25 13:44:13.347000 TestFramework (INFO): Initializing test directory /tmp/riffcash_test_runner_20180225_084321/walletbackup_211
2018-02-25 13:44:24.365000 TestFramework (INFO): Generating initial blockchain
2018-02-25 13:44:25.077000 TestFramework (INFO): Creating transactions
2018-02-25 13:45:13.099000 TestFramework (INFO): Backing up
2018-02-25 13:45:13.921000 TestFramework (INFO): More transactions
2018-02-25 13:46:11.862000 TestFramework (INFO): Restoring using wallet.dat
2018-02-25 13:46:22.029000 TestFramework (INFO): Re-starting nodes
2018-02-25 13:46:32.040000 TestFramework (INFO): Restoring using dumped wallet
2018-02-25 13:47:21.900000 TestFramework (ERROR): JSONRPC error
Traceback (most recent call last):
  File "[stripped]/riffcash/riffcash-core/test/functional/test_framework/authproxy.py", line 169, in _get_response
    http_response = self.__conn.getresponse()
  File "/usr/lib/python3.5/http/client.py", line 1197, in getresponse
    response.begin()
  File "/usr/lib/python3.5/http/client.py", line 297, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.5/http/client.py", line 258, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/usr/lib/python3.5/socket.py", line 575, in readinto
    return self._sock.recv_into(b)
socket.timeout: timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "[stripped]/riffcash/riffcash-core/test/functional/test_framework/test_framework.py", line 152, in main
    self.run_test()
  File "[stripped]/riffcash/riffcash-core/test/functional/walletbackup.py", line 185, in run_test
    self.nodes[0].importwallet(tmpdir + "/node0/wallet.dump")
  File "[stripped]/riffcash/riffcash-core/test/functional/test_framework/coverage.py", line 46, in __call__
    return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs)
  File "[stripped]/riffcash/riffcash-core/test/functional/test_framework/authproxy.py", line 152, in __call__
    response = self._request('POST', self.__url.path, postdata.encode('utf-8'))
  File "[stripped]/riffcash/riffcash-core/test/functional/test_framework/authproxy.py", line 126, in _request
    return self._get_response()
  File "[stripped]/riffcash/riffcash-core/test/functional/test_framework/authproxy.py", line 176, in _get_response
    self.__conn.timeout)})
test_framework.authproxy.JSONRPCException: 'importwallet' RPC took longer than 30.000000 seconds. Consider using larger timeout for calls that take longer to return. (-344)
2018-02-25 13:47:21.902000 TestFramework (INFO): Stopping nodes
2018-02-25 13:47:21.902000 TestFramework (ERROR): Unable to stop node
Traceback (most recent call last):
  File "[stripped]/riffcash/riffcash-core/test/functional/test_framework/test_framework.py", line 261, in stop_node
    self.nodes[i].stop()
  File "[stripped]/riffcash/riffcash-core/test/functional/test_framework/coverage.py", line 46, in __call__
    return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs)
  File "[stripped]/riffcash/riffcash-core/test/functional/test_framework/authproxy.py", line 152, in __call__
    response = self._request('POST', self.__url.path, postdata.encode('utf-8'))
  File "[stripped]/riffcash/riffcash-core/test/functional/test_framework/authproxy.py", line 125, in _request
    self.__conn.request(method, path, postdata, headers)
  File "/usr/lib/python3.5/http/client.py", line 1106, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python3.5/http/client.py", line 1141, in _send_request
    self.putrequest(method, url, **skips)
  File "/usr/lib/python3.5/http/client.py", line 974, in putrequest
    raise CannotSendRequest(self.__state)
http.client.CannotSendRequest: Request-sent

p2p-fullblocktest.py integration test failed

The integration test fails when running the integration test suite. The test produces the following error:

2p-fullblocktest.py failed, Duration: 585 s

stdout:
2018-07-01 03:24:00.336000 TestFramework (INFO): Initializing test directory /tmp/riffcash_test_runner_20180630_232302/p2p-fullblocktest_97
2018-07-01 03:24:04.109000 TestFramework.mininode (INFO): Connecting to Riffcash Node: 127.0.0.1:11776
2018-07-01 03:24:04.332000 TestFramework.comptool (INFO): Test 1: PASS
2018-07-01 03:24:05.023000 TestFramework.comptool (INFO): Test 2: PASS
2018-07-01 03:24:05.205000 TestFramework.comptool (INFO): Test 3: PASS
2018-07-01 03:24:05.438000 TestFramework.comptool (INFO): Test 4: PASS
2018-07-01 03:24:05.540000 TestFramework.comptool (INFO): Test 5: PASS
2018-07-01 03:24:05.723000 TestFramework.comptool (INFO): Test 6: PASS
2018-07-01 03:24:05.826000 TestFramework.comptool (INFO): Test 7: PASS
2018-07-01 03:24:06.047000 TestFramework.comptool (INFO): Test 8: PASS
2018-07-01 03:24:06.149000 TestFramework.comptool (INFO): Test 9: PASS
2018-07-01 03:24:06.251000 TestFramework.comptool (INFO): Test 10: PASS
2018-07-01 03:24:06.354000 TestFramework.comptool (INFO): Test 11: PASS
2018-07-01 03:24:06.457000 TestFramework.comptool (INFO): Test 12: PASS
2018-07-01 03:24:06.559000 TestFramework.comptool (INFO): Test 13: PASS
2018-07-01 03:24:06.664000 TestFramework.comptool (INFO): Test 14: PASS
2018-07-01 03:24:06.766000 TestFramework.comptool (INFO): Test 15: PASS
2018-07-01 03:24:06.849000 TestFramework.comptool (INFO): Test 16: PASS
2018-07-01 03:24:07.096000 TestFramework.comptool (INFO): Test 17: PASS
2018-07-01 03:24:07.160000 TestFramework.comptool (INFO): Test 18: PASS
2018-07-01 03:24:07.262000 TestFramework.comptool (INFO): Test 19: PASS
2018-07-01 03:24:07.364000 TestFramework.comptool (INFO): Test 20: PASS
2018-07-01 03:24:07.516000 TestFramework.comptool (INFO): Test 21: PASS
2018-07-01 03:24:07.618000 TestFramework.comptool (INFO): Test 22: PASS
2018-07-01 03:24:07.720000 TestFramework.comptool (INFO): Test 23: PASS
2018-07-01 03:24:07.826000 TestFramework.comptool (INFO): Test 24: PASS
2018-07-01 03:24:08.119000 TestFramework.comptool (INFO): Test 25: PASS
2018-07-01 03:24:08.287000 TestFramework.comptool (INFO): Test 26: PASS
2018-07-01 03:24:08.389000 TestFramework.comptool (INFO): Test 27: PASS
2018-07-01 03:24:08.491000 TestFramework.comptool (INFO): Test 28: PASS
2018-07-01 03:24:08.595000 TestFramework.comptool (INFO): Test 29: PASS
2018-07-01 03:24:08.749000 TestFramework.comptool (INFO): Test 30: PASS
2018-07-01 03:24:08.851000 TestFramework.comptool (INFO): Test 31: PASS
2018-07-01 03:24:09.035000 TestFramework.comptool (INFO): Test 32: PASS
2018-07-01 03:24:09.271000 TestFramework.comptool (INFO): Test 33: PASS
2018-07-01 03:24:09.324000 TestFramework.comptool (INFO): Test 34: PASS
2018-07-01 03:24:09.610000 TestFramework.comptool (INFO): Test 35: PASS
2018-07-01 03:24:09.713000 TestFramework.comptool (INFO): Test 36: PASS
2018-07-01 03:24:09.910000 TestFramework.comptool (INFO): Test 37: PASS
2018-07-01 03:24:10.024000 TestFramework.comptool (INFO): Test 38: PASS
2018-07-01 03:24:10.127000 TestFramework.comptool (INFO): Test 39: PASS
2018-07-01 03:24:10.229000 TestFramework.comptool (INFO): Test 40: PASS
2018-07-01 03:24:12.135000 TestFramework.comptool (INFO): Test 41: PASS
2018-07-01 03:24:15.886000 TestFramework.comptool (INFO): Test 42: PASS
2018-07-01 03:24:17.233000 TestFramework.comptool (INFO): Test 43: PASS
2018-07-01 03:24:17.335000 TestFramework.comptool (INFO): Test 44: PASS
2018-07-01 03:24:17.847000 TestFramework.comptool (INFO): Test 45: PASS
2018-07-01 03:24:18.429000 TestFramework.comptool (INFO): Test 46: PASS
2018-07-01 03:24:18.531000 TestFramework.comptool (INFO): Test 47: PASS
2018-07-01 03:24:18.633000 TestFramework.comptool (INFO): Test 48: PASS
2018-07-01 03:24:18.734000 TestFramework.comptool (INFO): Test 49: PASS
2018-07-01 03:24:18.836000 TestFramework.comptool (INFO): Test 50: PASS
2018-07-01 03:24:18.939000 TestFramework.comptool (INFO): Test 51: PASS
2018-07-01 03:24:19.045000 TestFramework.comptool (INFO): Test 52: PASS
2018-07-01 03:24:19.099000 TestFramework.comptool (INFO): Test 53: PASS
2018-07-01 03:24:19.202000 TestFramework.comptool (INFO): Test 54: PASS
2018-07-01 03:24:19.306000 TestFramework.comptool (INFO): Test 55: PASS
2018-07-01 03:24:19.411000 TestFramework.comptool (INFO): Test 56: PASS
2018-07-01 03:24:19.863000 TestFramework.comptool (INFO): Test 57: PASS
2018-07-01 03:24:19.968000 TestFramework.comptool (INFO): Test 58: PASS
2018-07-01 03:24:20.074000 TestFramework.comptool (INFO): Test 59: PASS
2018-07-01 03:24:20.557000 TestFramework.comptool (INFO): Test 60: PASS
2018-07-01 03:24:20.708000 TestFramework.comptool (INFO): Test 61: PASS
2018-07-01 03:24:20.813000 TestFramework.comptool (INFO): Test 62: PASS
2018-07-01 03:24:20.916000 TestFramework.comptool (INFO): Test 63: PASS
2018-07-01 03:24:21.419000 TestFramework.comptool (INFO): Test 64: PASS
2018-07-01 03:24:21.523000 TestFramework.comptool (INFO): Test 65: PASS
2018-07-01 03:24:21.627000 TestFramework.comptool (INFO): Test 66: PASS
2018-07-01 03:24:21.731000 TestFramework.comptool (INFO): Test 67: PASS
2018-07-01 03:24:22.008000 TestFramework.comptool (INFO): Test 68: PASS
2018-07-01 03:24:22.629000 TestFramework.comptool (INFO): Test 69: PASS
2018-07-01 03:24:23.278000 TestFramework.comptool (INFO): Test 70: PASS
2018-07-01 03:24:23.383000 TestFramework.comptool (INFO): Test 71: PASS
2018-07-01 03:24:23.488000 TestFramework.comptool (INFO): Test 72: PASS
2018-07-01 03:24:23.593000 TestFramework.comptool (INFO): Test 73: PASS
2018-07-01 03:24:24.148000 TestFramework.comptool (INFO): Test 74: PASS
2018-07-01 03:24:24.253000 TestFramework.comptool (INFO): Test 75: PASS
2018-07-01 03:24:24.358000 TestFramework.comptool (INFO): Test 76: PASS
2018-07-01 03:24:25.000000 TestFramework.comptool (INFO): Test 77: PASS
2018-07-01 03:24:25.120000 TestFramework.comptool (INFO): Test 78: PASS
2018-07-01 03:24:25.225000 TestFramework.comptool (INFO): Test 79: PASS
2018-07-01 03:24:25.781000 TestFramework.comptool (INFO): Test 80: PASS
2018-07-01 03:24:26.537000 TestFramework.comptool (INFO): Test 81: PASS
2018-07-01 03:24:27.767000 TestFramework.comptool (INFO): Test 82: PASS
2018-07-01 03:24:29.144000 TestFramework.comptool (INFO): Test 83: PASS
2018-07-01 03:24:30.352000 TestFramework.comptool (INFO): Test 84: PASS
2018-07-01 03:24:30.466000 TestFramework.comptool (INFO): Test 85: PASS
2018-07-01 03:24:30.580000 TestFramework.comptool (INFO): Test 86: PASS
2018-07-01 03:24:32.066000 TestFramework.comptool (INFO): Test 87: PASS
2018-07-01 03:24:33.264000 TestFramework.comptool (INFO): Test 88: PASS
2018-07-01 03:24:34.428000 TestFramework.comptool (INFO): Test 89: PASS
2018-07-01 03:24:34.585000 TestFramework.comptool (INFO): Test 90: PASS
2018-07-01 03:24:35.505000 TestFramework.comptool (INFO): Test 91: PASS
2018-07-01 03:24:35.662000 TestFramework.comptool (INFO): Test 92: PASS
2018-07-01 03:24:36.685000 TestFramework.comptool (INFO): Test 93: PASS
2018-07-01 03:24:36.794000 TestFramework.comptool (INFO): Test 94: PASS
2018-07-01 03:30:42.389000 TestFramework.comptool (INFO): Test 95: PASS
2018-07-01 03:31:28.201000 TestFramework.comptool (INFO): Test 96: PASS
2018-07-01 03:32:30.592000 TestFramework (ERROR): Assertion failed
Traceback (most recent call last):
  File "test/functional/test_framework/test_framework.py", line 152, in main
    self.run_test()
  File "test/functional/p2p-fullblocktest.py", line 73, in run_test
    self.test.run()
  File "test/functional/test_framework/comptool.py", line 356, in run
    raise AssertionError("Test failed at test %d" % test_number)
AssertionError: Test failed at test 97
2018-07-01 03:32:30.594000 TestFramework (INFO): Stopping nodes


stderr:
Traceback (most recent call last):
  File "test/functional/p2p-fullblocktest.py", line 1290, in <module>
    FullBlockTest().main()
  File "test/functional/test_framework/test_framework.py", line 175, in main
    self.stop_nodes()
  File "test/functional/test_framework/test_framework.py", line 272, in stop_nodes
    self.stop_node(i)
  File "test/functional/test_framework/test_framework.py", line 264, in stop_node
    return_code = self.bitcoind_processes[i].wait(timeout=BITCOIND_PROC_WAIT_TIMEOUT)
  File "/usr/lib/python3.5/subprocess.py", line 1650, in wait
    raise TimeoutExpired(self.args, timeout)
subprocess.TimeoutExpired: Command '['src/riffcashd', '-datadir=/tmp/riffcash_test_runner_20180630_232302/p2p-fullblocktest_97/node0', '-server', '-keypool=1', '-discover=0', '-rest', '-logtimemicros', '-debug', '-debugexclude=libevent', '-debugexclude=leveldb', '-mocktime=0', '-uacomment=testnode0', '-whitelist=127.0.0.1']' timed out after 60 seconds

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.